您是否曾经尝试复制粘贴某些文本,却发现它令人沮丧、笨拙甚至不可能?我敢打赌您遇到过。这并非偶然。在网络上,您可以对其进行相当程度的控制。让我们将一些内容列出,供您思考。
并非真正的文本
这可能是最明显的问题,所以我们不必过多关注它。如果文本可以在网络上是“真正的文本”,请务必这样做。与文本图像相比,真实文本更易于访问、更易于索引且更有用。您可以选择它进行复制粘贴!
意外重叠
您是否曾经见过文本底部逐渐淡出的效果?这通常是通过在文本顶部叠加渐变图像来实现的。您可以透过它的一部分,但该元素仍然位于文本的顶部,这意味着鼠标交互发生在重叠处,而不是文本上。

在 此演示中,重叠是一个用渐变填充并定位在顶部的伪元素。值得庆幸的是,这在很大程度上是可以解决的问题。在重叠处使用 pointer-events: none;
将大有帮助。设置后,指针交互将完全忽略该元素。点击将直接穿过,就好像它不存在一样。
这很好,但 IE 10 不支持 pointer-events。如果您仍然想依赖它,Modernizr v3 有一个测试,因此您只有在知道 pointer-events 可用时才能应用叠加层。
或者,您可以像 我们在本文中介绍的那样,对各个行进行着色以使其看起来像淡出。
选择后的弹出窗口
有些网站在您选择某些文本后会做出一些非常大的假设。一个常见的情况是:哦,太好了,你好,你好,我看到你,你显然想在社交媒体上分享这段文字,让我来帮忙。 并非每个人都喜欢这样。除了自以为是和过于热心之外,它还会 妨碍 截屏。

Highlighter.js 是一个让这一切变得非常容易的库。
CSS 控制可选择性
实际上,CSS 存在一个专门用于控制文本可选择性的属性:user-select
。
.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 */
}
除了几个 浏览器怪癖之外,设置了该属性的文本是不可选择的。在尝试设计围绕网站上文本可选择性的更好 UX 时,这非常有用。
在移动设备上,文本选择通常通过长按来完成,这会显示一些文本选择选项。您可以 阻止 该“弹出”(从而阻止文本选择),方法是使用
-webkit-touch-callout: default /* displays the callout */
-webkit-touch-callout: none /* disables the callout */
其他可见但无法复制的文本
您可以使用上面的 CSS 强制文本不可选择,但某些文本不会自动被选择
- 默认计数器,例如无序列表中的项目符号或有序列表中的数字
- 自定义 CSS 计数器
- 伪元素 文本
意外选择行号
有时您会在网站上遇到想要复制粘贴的代码块。粘贴后,您会发现行号也一起粘贴过来了。
这实际上有点令人惊讶,因为看起来您必须特别去做才能做到这一点。根据我们现在的了解,这些行号可以使用 CSS 阻止其被复制。或者代码可以被标记为列表以显示不会复制的数字。或者它可以使用不会复制的自定义计数器。或者在不会复制的行之前的伪元素(相关文章)。
因此,这只能发生在他们只是将一些文本放在行首的元素中,并且没有采取任何措施阻止其被复制的情况下。这可能是一个很容易解决的问题,我们可以鼓励任何违规者这样做。
使用 JavaScript 选择(所有)文本
表单元素通常用于此目的。如果您想提供一些专门用于复制粘贴的文本,通常将其放在 input
或 textarea
中。
<textarea id="ta">a bunch of text</textarea>
然后,以编程方式选择该文本非常容易
var ta = document.getElementById("ta");
ta.focus();
ta.select();
您无法在 上执行此操作
或其他任何内容。此外,如果用户位于表单元素内,“选择全部”命令通常只会选择该元素范围内的文本,这是不错的预期行为。
如果您希望在点击文本时将其选中的行为,以下是一种非常简洁的 jQuery 方法
$('#ta').on("focus", function(e) {
e.target.select();
$(e.target).one('mouseup', function(e) {
e.preventDefault();
});
});
mouseup
中的这部分允许文本在 mouseup 事件后保持选中状态。通常,mouseup 会取消选择文本并激活光标。
我喜欢 这种方法,因为它也不会强制选择所有文本无论如何(人们 不喜欢),而只在初始焦点时选择。因此,在焦点之后,如果您想自己更改选择并仅复制文本的一部分,则可以这样做。

如果您不提供点击选择,这有时也会 让用户不满意,因此这是一个平衡。因此,我喜欢上面这种先聚焦到选择,然后让其保持原状的方法。
关于使用 JavaScript 选择文本,还有更多需要了解的内容,包括 范围选择 等,这 非常复杂,最好留到另一篇文章中介绍。
以编程方式复制到剪贴板
此功能 最近出现在 JavaScript 中。在撰写本文时,只有 Chrome 和 IE 支持。它是通过 document.execCommand('copy');
实现的。
这里有一段我还没有完全了解的历史。我认为这在很大程度上是一个安全问题,这就是为什么它在 JavaScript 中是不可能的。更不用说一个品味问题了(谁想访问一个网站却发现他们的剪贴板被弄乱了?)。无论出于何种原因,它现在都可以使用了。
Matt Gaunt 提供了一些示例代码
请发送邮件至 [email protected]
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();
});
以编程方式将文本复制到剪贴板一直以来都是一个愿望。我们过去不得不使用 Flash,通常是一个名为 ZeroClipboard 的库。这是 David Walsh 关于此主题的教程。
如何复制粘贴并控制样式/格式
当你复制文本时,通常会连带复制其格式。

在 Mac 上,有一个**粘贴并匹配样式**命令,在你不想要原始格式的时候非常有用。比如粘贴到电子邮件中。Command-Shift-V 是这个命令的快捷键。

我通常更喜欢这种行为,所以我做了点事情,将它映射到 Command-V(覆盖正常的粘贴)。

如果你需要,你仍然可以通过菜单粘贴带有格式的文本。
剪贴板上的额外内容
你有没有从某个网站上选择了一些文本,却发现粘贴后,你的选择后面出现了一些额外的垃圾?阅读更多内容在 FART-KNUCKLE.BUSINESS!!!
尴尬的保留大写
你可以使用 CSS 中的 text-transform: uppercase;
属性将文本大写。但是,它会导致不同浏览器在复制粘贴时出现相当大的(烦人)功能差异。
根据我快速测试的结果
- Firefox 和 IE **尊重原始文本**(DOM 中的内容)。
- Chrome、Safari、Opera 和 iOS **尊重 CSS** 的大写设置。
我更喜欢前者。
块级链接可能使复制更困难
在 HTML5 中,我们了解到现在可以将锚标签包裹在任何我们想要的内容周围。即使它们是内联元素,我们也可以将它们包裹在块级元素周围,而不用担心无效。但这并非没有后果的。
标题
这使得整个块级标题成为一个链接,无需任何 CSS 辅助,但它确实使标题有点难以复制。通过包裹该标记并使用 h3 > a { display: block; }
可以使其更容易一些,假设 h3 上有一些填充,因为这样你就可以从填充开始选择并移动。
所以一方面点击区域更大,另一方面复制稍微困难一些(如果你习惯从右到左复制)。由你决定。
查看 CodePen 上 Chris Coyier (@chriscoyier) 的作品 块级标题有点难复制。

有时块级结构本身会导致令人恼火的情况。就像这里,你试图选择一个电影标题,但鼠标偏离了一像素,你就得到了一堆在完全无关位置的奇怪文本。

这里的问题不算很大,因为我认为人们对此已经比较习惯了,知道如何退回并获取他们需要的内容。但值得考虑。即使像 Flexbox 排序这样的东西也会完全改变文本选择的行为,即使在视觉上看起来完全相同。
查看 CodePen 上 Chris Coyier (@chriscoyier) 的作品 flex 排序和选择。

粘贴到控制台
经典的错误:在关于如何在终端执行操作的博文中,复制控制台命令开头的“$”。举手的人。只有我吗?该死。无论如何。有一个相当有趣的dotfile 东西可以在你这样做的时候警告你。
还有其他问题吗?
你对网络上的复制粘贴或选择是否有任何个人不满?
关于伪元素中的文本的另一个说明:它们在页面上不可搜索(⌘-f),这取决于具体情况,也是一个可访问性问题。
自动选择发生在鼠标抬起时,因此你可以通过按住按钮并按下 ⌘C 来复制文本的一部分。
我是一个双击选择所有文本的粉丝,这取决于上下文。
我知道有些人认为双击(和三击)是糟糕的用户体验,但是……无所谓。
在 Javascript 中选择整个文本是史上最糟糕的事情。真的难以置信有人会喜欢这样。
“实际上有一个 CSS 属性专门用于控制文本的可选择性:user-select。”
哦,太好了。更多的 CSS 将被滥用到 N 次方,同时徒劳地试图从儿童抄袭者那里“保护”自己的知识产权,这对那些只想保存一个带有段落的链接以提醒他们该愚蠢域名后面有什么有趣内容的人来说是有害的。
我完全同意。当想要阻止 UI 元素被选中时,合法用户用例非常狭窄,而该 CSS 属性可以以任何可能的方式被滥用。
有时在自定义 div 按钮上使用 user-select:none; 很好,因为它可以防止用户双击按钮时按钮内的文本被选中。
至少这是我唯一使用它的时候。
对于各种弹出图像(取决于你希望它们如何关闭)来说,它实际上是一个救星,当你的用户不小心选中一个图像而无法可靠地取消选中时;这样,它们就不会被蓝色覆盖,并且你可以通过其他方式可靠地复制/操作图像,例如通过右键点击。
对于触摸屏上的信息亭模式也很有用。防止用户误触按钮时选择文本。
其他不可复制的可见文本
在 Firefox 中,
<input disabled>
和<textarea disabled>
不允许你选择或复制文本。尝试复制锁定字段的表单中的数据非常令人恼火。
但是,
<input readonly>
允许选择和复制。“IE 10 不支持 pointer-events”
我敢肯定我曾经在早期版本的 IE 中找到了一种使用 SVG 的解决方法。我想回忆一下,但现在太晚了,我应该睡觉了 :P
不错的文章,非常全面。
一个小小的错别字。
$(e.target).one(‘mouseup’, function(e) {
应该是 .on(…)
没有错别字。
https://api.jqueryjs.cn/one/
你可以通过在鼠标抬起之前按住 ctrl + c 来避免网站选择所有文本,而你只需要一部分。
嗨,Chris
你也可以将普通粘贴快捷键设置为 CMD + SHIFT + V。这样你甚至都不需要菜单。;)
Marc
请记住,你可以在 Firefox 中创建多选。使用
ctrl
/cmd
+ 选择有没有人对处理复制粘贴内容的最佳基于 Web 的所见即所得编辑器有什么看法?
有没有人对处理复制粘贴内容的最佳基于 Web 的所见即所得编辑器有什么看法?
请
我们正在 copycopy.com 上构建一个。
在 OSX 上,你可以在每个应用程序中使用 **CMD+Shift+alt+v** 来无格式粘贴。
关于你关于 text-transform 和复制大写字母的观点,我也更喜欢 Firefox/IE 的方法,即复制源文本,而不是带样式的文本。我对此发表过抱怨:http://rosel.li/060612
我也认为基于 WebKit 的浏览器违反了规范,因为它们复制了大写文本:“此属性转换文本以用于样式目的。(它对底层内容没有影响。)”规范:http://www.w3.org/TR/css-text-3/#text-transform
我理解为底层内容(我正在复制的内容)不应该被更改(它通过转换被更改了)。
“诸如 flexbox 排序之类的东西可以完全改变文本选择的行为,即使在视觉上看起来完全相同。”
这可能会造成严重的可访问性问题,因为阅读顺序发生了变化,并且,如果你有可聚焦的元素,则 Tab 顺序与阅读顺序/列表不同(例如,按钮列表遵循 DOM,而 Tab 顺序遵循视觉顺序)。
是的,你也可以双击一个单词来选择它。