你可能曾经尝试过复制网页上的一些文字,得到的却是令人沮丧的的结果。这篇文章介绍相关的内容。

不是真正的文字

这可能是最常见的问题,很多人尝试对一张带有文字的图片进行像文字那样的选择,复制当然不行了。

重叠层遮挡

你应该也见过文章底部有那种淡出的效果,通常的做法是将一张渐变的图片置于文字的上方,所以你可以看到图片下方的内容,但是你选不了那些文字。

https://dn-w3ctrain.qbox.me/overlaptext.gif

这个Demo中,我们使用伪元素和渐变图片来实现这种效果。庆幸的是,在大多数情况下,我们可以设置pointer-events:none属性来让上面的渐变图片不接受鼠标交互事件,于是点击事件就能去到文字内容部分了。

注:然而IE10不支持这个属性

弹出小工具

一些网站在你选完文字以后,做了一些有趣的行为。比如弹出一些惊叹号,一下小工具之类的。当然并不是所有人都喜欢。

https://dn-w3ctrain.qbox.me/popup-medium.png

Highlighter.js这个插件可以帮你很容易实现。

你也可以看看stackoverflow上的做法。

CSS控制可否选择

有一个CSS属性可以控制文字可否被选中 user-select。

1
2
3
4
5
6
.unselectable {
-webkit-user-select: none; /* Chrome all / Safari all */
-moz-user-select: none; /* Firefox all */
-ms-user-select: none; /* IE 10+ */
user-select: none; /* Likely future */
}

在移动设备上,可能大部分时候是通过长按来选择文字内容,你可以通过callout来阻止。

1
2
-webkit-touch-callout: default /* displays the callout */
-webkit-touch-callout: none /* disables the callout */

其他看得见,但是你选不了的方式

下面形式生成的文字,你也选不了:

比如:

1
2
3
div::after {
content: "hi";
}
1
2
3
4
<div>
<!-- Rest of stuff inside the div -->
hi
</div>

上面代码会出现两个”hi”但是你只能选中一个。

无法复制代码行数

我们在一些技术博客经常看到一些牛逼的代码,复制下来后发现,前面的行数并没有复制下来。(这是正确的做法),可能原因就是上面的某一种。

自动选中全部

表单元素经常使用这个,如果你想让文字可以像人们熟悉的可选择方式(ctl + A之类的),那么就使用input 或者 textarea来承载。

1
<textarea id="ta">a bunch of text</textarea>
1
2
3
var ta = document.getElementById("ta");
ta.focus();
ta.select();

如果你想操作是当选中文本的一部分的时候,整个元素都被你选中,那么你可以用下面的代码:

1
2
3
4
5
6
$('#ta').on("focus", function(e) {
e.target.select();
$(e.target).one('mouseup', function(e) {
e.preventDefault();
});
});

监听mouseup并preventDefault是为了阻止鼠标事件改变了选择内容。

js将内容复制到剪切板

你可以使用javascriptdocument.execCommand('copy');,复制选中代码

1
2
<p>Email me at <a class="js-emaillink" href="mailto:matt@example.co.uk">matt@example.co.uk</a></p>
<p><button class="js-emailcopybtn">Copy</button></p>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var copyEmailBtn = document.querySelector('.js-emailcopybtn');
copyEmailBtn.addEventListener('click', function(event) {
// Select the email link anchor text
var emailLink = document.querySelector('.js-emaillink');
var range = document.createRange();
range.selectNode(emailLink);
window.getSelection().addRange(range);
 
try {
// Now that we've selected the anchor text, execute the copy command
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Copy email command was ' + msg);
} catch(err) {
console.log('Oops, unable to copy');
}
 
// Remove the selections - NOTE: Should use
// removeRange(range) when it is supported
window.getSelection().removeAllRanges();
});

不过现在这部分代码兼容性不强。我们通常见到的是使用ZeroClipboard这个库来实现的。看看相关教程

如何去掉样式的复制

当你复制文字的时候,经常会连着样式一起复制下来。

https://dn-w3ctrain.qbox.me/copy-style.gif

mac系统有一种Past and Match Style的方式,它能非常有效的去掉你复制内容的样式。你可以设置快捷键Command-Shift-V

https://dn-w3ctrain.qbox.me/copy-style-no.gif

https://dn-w3ctrain.qbox.me/20130817_tip_pastematchstyle_shortcut-screenshot.png

使用a标签会让内容难以复制

在HTML5中,我们可以使用a标签包裹任何我们想包裹的内容。

1
2
3
4
5
<a href="#0">
<h3>
Title
</h3>
</a>

这会让a标签里面的内容难以被复制。如果换成

1
2
3
h3 > a {
display:block;
}

那么复制会变得稍微简单一下,然而如果你习惯从右到左选中的话,同样会让你抓狂的。

See the Pen Block titles kinda hard to copy by Chris Coyier (@chriscoyier) on CodePen.

web上的复制的更多相关文章

  1. 前端之web上传文件的方式

    前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构造请求上传文件 1. web上传 ...

  2. 在web上逐行输出较大的txt文件

    在某些场景下,需要在web上展示一些日志文件,这些日志文件是放在文件服务器上的一些txt. 当日志文件很大时,下载日志会导致页面长时间卡住,一直在loading状态,而且下载完日志之后分析日志并生成d ...

  3. 我需要在Web上完成一个图片上传的功能

    我需要在Web上完成一个图片上传的功能. 这个页面需要能从手机中选择图片上传. 首先,这个页面是从微信上面触发的,所以修改了微信的的入口地址,增加了身份识别号作为传参. 跳转到页面的时候,页面先检查身 ...

  4. AS与.net的交互——加载web上的xml

    最近搞了个私活,需要用as去加载一个网站的xml,不过本人as也不咋滴,就去看看怎么玩,看完之后也蛮简单的. 由于业务上比较复杂,就随便说个小例子吧. 很多时候,为了页面区域更加灵活,生动,有吸引力, ...

  5. Android项目,从web上取下汉字,中文部分乱码

    Android项目,从web上取下汉字,中文部分乱码. 常见问题,搜索一下,网上有很多办法解决.如果还没有试过这个办法,可以尝试一下. BufferedReader in = new Buffered ...

  6. C#之读取web上的xml

    一.使用LINQ读取使用Xdocument上的Load方法,可以快速的加载一个XML文档,然后使用LINQ对 加载XML文档进行查询或其他操作,这里仅简单偏历.所以,一旦查询一组元素有返回元素集,就可 ...

  7. 实现Web上的用户登录功能

    关于如何实现web上的自动登录功能 文章来源http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能 ...

  8. VC 最爱问的问题:你这个创业项目,如果腾讯跟进了,而且几乎是产品上完全复制,你会怎么办?

    VC 最爱问的问题:你这个创业项目,如果腾讯跟进了,而且几乎是产品上完全复制,你会怎么办? http://www.zhihu.com/question/19607233 朱继玉,独立精神,自由思想. ...

  9. 第九篇:web之前端之web上传文件的方式

    前端之web上传文件的方式   前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构 ...

随机推荐

  1. Unity中SendMessage和Delegate效率比较

    网上直接搜的代码.需要的使用也简单,所以就不过多说明. 但是网上都说,他们之间的差距,delegate比较快,效果高.怎么个高法呢?还是自己来测试下时间. 故此, 个人之用来比较下时间差别. 一.直接 ...

  2. 如何使用vue的axios结合PHP去上传文件

    我们在做表单提交的时候,往往会碰到一些表单提交的需求,那vue的axios与上传文件碰撞后不会出现什么不一样的火花吗,听我一一道来: 首先,我们需要对写一个vue的axios的表单提交,由于本人用的是 ...

  3. [直观学习排序算法] 视觉直观感受若干常用排序算法 以及 iOS 资料

    http://www.zhfish.net/?s=点击范围 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则 ...

  4. cocos2dx游戏--欢欢英雄传说--添加人物

    接下来需要导入精灵帧资源,因为之前下载了TexturePacker,然后通过TexturePacker的"Publish sprite sheet"方法可以生成一个.pvr.ccz ...

  5. C++虚继承的概念[转]

    C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...

  6. [XML] CoolFormat

    http://files.cnblogs.com/files/wjs16/CoolFormat3.4.rar

  7. struts2的占位符*在action中的配置方法

    转自:https://blog.csdn.net/u012546338/article/details/68946633 在配置<action> 时,可以在 name,class,meth ...

  8. LCA(离线算法)

    hdu4547 CD操作 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  9. postgresql----继承表INHERITS PARENT TABLE

    使用INHERITS创建的新表会继承一个或多个父表,子表只会继承父表的表结构和NOT NULL,DEFAULT,CHECK三种约束,主键,外键和唯一键以及索引不会被继承,所以修改父表的结构(增删字段) ...

  10. Centos6.5SSH登录使用google二次验证

    一般ssh登录服务器,只需要输入账号和密码,但为了更安全,在账号和密码之间再增加一个google的动态验证码.谷歌身份验证器生成的是动态验证码,默认30秒更新 工具/原料   CentOS 6.5 X ...