移动端html5页面长按实现高亮全选文本内容的兼容解决方式
近期须要给html5的WebAPP在页面上实现一个复制功能:用户点击长按文本会全选文字并弹出系统“复制”菜单。用户能够点击“复制”进行复制操作。然后粘贴到AppStore搜索相应的应用。之所以不是採用链接形式直接跳转到AppStore相应应用是为了通过用户的主动输入关键词搜索给推广的企业App添加权重。所以这一个“复制”功能对用户的体验至关重要。
尝试了一些做法。在安卓/iOS平台上的兼容性都不是非常好。在微信浏览器内是非常easy实现长按文本激发系统菜单。高亮全选文本内容的。
可是在其它浏览器的表现就不是非常一致了。
包含模拟focus input。JavaScript Selection, 使用a标签尝试激活系统菜单。
这些方法都存在兼容的缺陷。
1)尽管使用带有href属性的a标签在uc浏览器和百度浏览器上长按文本会出现“自由复制”/“选择文本”菜单,选择该菜单后会出现“全选/复制”的菜单,可是在一些安卓手机的系统浏览器和iPhone中却被视为纯链接,仅仅弹出“复制链接”,没有“复制文本”菜单。况且即使仅仅考虑少部分浏览器可行。这样也给用户操作多了一步。添加了复杂度。所以该方案不可取。
2)借助selection和range的方法须要考虑到不同浏览器的兼容性,代码例如以下:
function selectText(element) {
var doc = document,
text = doc.getElementById(element),
range,
selection;
if (doc.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(text);
range.select();
} else if (window.getSelection) {
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(text);
selection.removeAllRanges();
selection.addRange(range);
/*if(selection.setBaseAndExtent){
selection.setBaseAndExtent(text, 0, text, 1);
}*/
}else{
alert("none");
}
}
遗憾的是在iphone Safari上依旧无法通过点击或长按高亮选中全部文本(既然也支持window.getSelection,为何在Safari浏览器addRange操作后文本不能默认选中,知道原因的请留言不吝赐教)。因此。该方式存在缺陷。
主动选中文本区域的方法后面后附上。
3)iPhone用户可能知道,长按某一文本选区内文字周围的空白区域,Safari会自己主动将该选区内的文本高亮全选(目标文本须要放在独立的div块级容器内)。依据这一特性,用CSS margin修饰一下,利用这个特点,正好能够解决上述另外一种方法在ios设备的不兼容。经过測试,不管安卓和ios平台。一般手机自带的系统浏览器都是能够兼容的。至于uc浏览器、百度浏览器等其它厂家的移动端产品,因为有不同的机制,仅仅能使用这些浏览器菜单提供的“自由复制”功能。
所以,我综合了另外一种和第三种方式,使用jquery mobile中的taphold事件来模拟longtap操作激发手机系统的复制菜单,这样基本上能够做到在全部移动设备浏览器上都能实现长按文本区域来高亮选中全部文本内容。
再提一句,taphold的兼容bug这里就不具体附解决方法了,假设你的项目要求精益求精,你能够自行搜索解决方式。
以下列出我的解决方式。
详细代码例如以下:
HTML代码:
<div class=" para requirement">
<div class="tips tips-t">
1、必须首次下载才生效<br/>
2、不能从排行榜下载哦
</div>
<div class="cparea">
<div class="kwd" id="kwd"><span>三国艳义手机优化大师</span></div>
</div>
<div class="cparea">
<span class="kdes"><b>★</b>长按虚线框,拷贝关键词</span>
</div>
<a href="https://itunes.apple.com/cn/" data-role="button" class="downlink">去AppStore搜索下载</a>
</div>
JavaScript代码:
<script type="text/javascript">
$("#kwd").bind("taphold", function(){ //不支持iPhone/iTouch/iPad Safari
var doc = document,
text = doc.getElementById("kwd"),
range,
selection;
if (doc.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(text);
range.select();
} else if (window.getSelection) {
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(text);
selection.removeAllRanges();
selection.addRange(range);
}else{
alert("浏览器不支持长按复制功能");
}
});
</script>
关键的CSS代码:
.cparea{
text-align: center;
font-family: Microsoft Yahei;
margin: -2em 0 0;
}
.kwd{
display: inline-block;
color: #272727;
background-color: #fff;
font-size: 1.1875em;
font-size: 1.1875em;
padding: .75em 1em;
border: 1px dashed #e60012;
-webkit-user-select:element;
margin: 2em;
}
.kwd span{
display: block;
border: 1px solid #fff;
}
.kdes{
display: inline-block;
color: #212121;
font-size: .875em;
padding-top: 0;
}
.kdes b{
color: #ed5353;
font-size: 1.25em;
padding-right: .1em;
}
说明:这里的margin:2em正是为了实现Safari浏览器上的长按全选功能,为了尊重还原设计稿效果,父容器.cparea又使用了负边距来抵消这个2em的外边距。终于。不仅视觉上和设计图保持了一致。也实现了长按全选激发系统菜单。
最后再补充一下支持Safari下的完整方法:
$("#kwd").bind("taphold", function(){
var doc = document,
text = doc.getElementById("kwd"),
range,
selection;
if (doc.body.createTextRange) { //IE
range = document.body.createTextRange();
range.moveToElementText(text);
range.select();
} else if (window.getSelection) { //FF CH SF
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(text);
selection.removeAllRanges();
selection.addRange(range);
//測试
console.log(text.textContent);
text.innerText && console.log(text.innerText); //FireFox不支持innerText
console.log(text.textContent.length);
text.innerText && console.log(text.innerText.length); //在Chrome下长度比IE/FF下多1
console.log(text.firstChild.textContent.length);
text.innerText && console.log(text.firstChild.innerText.length);
console.log(text.firstChild.innerHTML.length);
//注意IE9-不支持textContent
makeSelection(0, text.firstChild.textContent.length, 0, text.firstChild);
/*
if(selection.setBaseAndExtent){
selection.selectAllChildren(text);
selection.setBaseAndExtent(text, 0, text, 4);
}
*/
}else{
alert("浏览器不支持长按复制功能");
}
});
function makeSelection(start, end, child, parent) {
var range = document.createRange();
//console.log(parent.childNodes[child]);
range.setStart(parent.childNodes[child], start);
range.setEnd(parent.childNodes[child], end);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
转载请注明来自于CSDN freshlover的空间。
移动端html5页面长按实现高亮全选文本内容的兼容解决方式的更多相关文章
- 移动端html5页面导航栏悬浮遮挡内容第一行解决办法
参考:https://zhidao.baidu.com/question/1608232105428062147.html 1.设置导航栏div属性position:fixed; .nav-fixed ...
- 当一个页面出现多个checkbox全选时的处理
HTML: <input type="checkbox" onclick="boxOnclick(this,'some1')">全选一 <in ...
- 移动端HTML5资源整理
目录 meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅 ...
- 移动端HTML5性能优化
移动端HTML5性能优化 [导读] 得益于智能手机的普及和各行各业互联网+的运动,移动端的市场占比疯狂增长. 2016年1月发布的2015年电商数据显示,2015年中国移动端网购交易额同比暴涨123 ...
- 2016/3/30 租房子 ①建立租房子的增、删、改php页面 ②多条件查询 ③全选时 各部分全选中 任意checkbox不选中 全选checkbox不选中
字符串的另一种写法:<<<AAAA; 后两个AA回车要求顶格 不然报错 例子: <!DOCTYPE html> <html lang="en" ...
- 移动端H5页面禁止长按复制和去掉点击时高亮
/*设置IOS页面长按不可复制粘贴,但是IOS上出现input.textarea不能输入,因此将使用-webkit-user-select:auto;*/ *{ -webkit-touch-callo ...
- html5 移动端单页面布局
序 移动端的web网页使用的是响应式设计,但一般我们看到的网站页面都是跳转刷新得到的,比如通过点击一个menu后进入到另一个页面 今天来说下是移动端的单页面的布局.单页面就是一切操作和布局都是 ...
- html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式
对于html5移动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿.. ...
- (转)倾力总结40条常见的移动端Web页面问题解决方案
原文链接:戳这里 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太 ...
随机推荐
- java线程总结--synchronized关键字,原理以及相关的锁
在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...
- 基于flask的网页聊天室(三)
基于flask的网页聊天室(三) 前言 继续上一次的内容,今天完成了csrf防御的添加,用户头像的存储以及用户的登录状态 具体内容 首先是添加csrf的防御,为整个app添加防御: from flas ...
- 【BZOJ 3555】 [Ctsc2014]企鹅QQ(哈希)
Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大 ...
- 数据结构实验3:C++实现顺序栈类与链栈类
实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...
- Android开发——后台获取用户点击位置坐标(可获取用户支付宝密码)
1. getevent命令 我们首先是根据adb shell getevent命令获取到被点击位置的信息. 这里要说明的是,不同的手机手机获得的点击输出是不一样的.以我的真机为例,输出如下 本文原创, ...
- mysql语句查询:查询距离某个日期10天的数据
select * from table where state = '1' and DATE_SUB(CURDATE(), INTERVAL 10 DAY) <= begin_time
- [NOI2003]Editor(块状链表)
传送门 看了看块状链表,就是数组和链表的合体. 看上去好高大尚,思想也很简单. 但是发现代码量也不是很小,而且代码理解起来也是费尽得很,倒不如splay用起来顺手. 在加上适用范围貌似不是特别广,所以 ...
- 【模板】prim的heap优化
简单的代码.. 时间复杂度为O((n + m)logn) 大部分情况下还是跑不过kruskal的,慎用. #include <cstdio> #include <queue> ...
- Codevs 2756 树上的路径
2756 树上的路径 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给出一棵树,求出最小的k,使得,且在树中存在 ...
- [APIO2012] 派遣 dispatching
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4580 Solved: 2348 Description 在一个忍者的帮派里,一些忍者们被选中派遣给 ...