【问题标题】:How to prevent part of HTML text from being copied when copying adjacent?复制相邻时如何防止部分HTML文本被复制?
【发布时间】:2016-01-03 07:42:00
【问题描述】:

我写了一个JavaScript widget,它添加了行号,而我无法弄清楚的一件事是在复制文本时防止数字被复制。我希望人们能够复制数字周围的序列,但不能复制数字。 Here is an example of the script's results.

基本上:

<span>useful stuff to be copied </span>
<span style="some-mysterious-setting: True;"> gloss to be discarded in selection </span>
<span> useful stuff to be copied</span>

数字被实现为单独的跨度元素,而不是表格或任何花哨的东西。我在 CSS 中尝试了user-select: none; 及其变体,但这意味着它不会被突出显示,但它仍然会复制编号。

【问题讨论】:

  • 您是按照示例中的方式输出它还是像典型的编辑器那样输出它?喜欢每行一个数字吗?
  • 哦,这实际上是你的代码。
  • 我带来了 GitHub 文件的更改。谢谢大家!

标签: javascript html css


【解决方案1】:

我想这应该可行:

Javascript:

var elem = document.getElementsByClassName("myElement");
elem.unselectable = "on";

HTML:

<span>useful stuff to be copied </span>
<span class="myElement"> gloss to be discarded in selection </span>
<span> useful stuff to be copied</span>

【讨论】:

  • 问题是,如果您在文本的前面和末尾有文本并复制它,您仍然会在剪贴板中获得中间不可选择的部分
  • 是的,我检查过了。不幸的是,它不适用于拆分文本,但适用于整个文本!
【解决方案2】:

你也可以使用 CSS counter 来得到你想要的结果,如果你有大量的数据你不再需要指定行号。

CSS

table
{
    counter-reset: line;
    counter-increment: line;
}

td:nth-of-type(1)::before {
  counter-increment: line+10;
  content: counter(line) " ";
}

td:nth-of-type(1)
{
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

HTML

<table>
  <tr>
    <td></td>
    <td>Row 1</td>
  </tr>
  <tr>
    <td></td>
    <td>Row 2</td>
  </tr>
  <tr>
    <td></td>
    <td>Row 3</td>
  </tr>
  <tr>
    <td></td>
    <td>Row 4</td>
  </tr>
</table>

【讨论】:

  • 对不起,我在选择答案之前没有看到这个答案。但我肯定会研究 Counter ,因为它在这里可能很方便。谢谢。
  • 它对于大多数用途来说都很棒,但我认为没有办法让它变成 4 位数字,以便它以 0011 而不是 11 开头。
  • @Alejalapeno 没有办法用计数器来做,你的答案会更好。
【解决方案3】:

所以你不需要 Javascript。

解决方案是使用伪元素,而不是实际将数字放入元素中。

<span class="line-number" data-line-number="1"></span>

CSS:

.line-number::before {
  content: attr(data-line-number);
}

td:nth-of-type(1) {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
td:nth-of-type(1)::before {
  content: attr(data-line-number);
}
<table>
  <tr>
    <td data-line-number="1"></td>
    <td>Test row</td>
  </tr>
  <tr>
    <td data-line-number="2"></td>
    <td>Test row</td>
  </tr>
  <tr>
    <td data-line-number="3"></td>
    <td>Test row</td>
  </tr>
  <tr>
    <td data-line-number="4"></td>
    <td>Test row</td>
  </tr>
</table>

【讨论】:

  • 另外我建议使用我的 sn-p 示例中的表格。没有必要,但在示意性和性能方面是有意义的。
  • 我喜欢纯 CSS 的解决方案,所以这个会得到我的喜欢!不知道您可以使用 CSS 访问数据属性。甚至可以使用 attr() 获取其他非数据属性吗?您在类名class=".line-number" 中也有一个点
  • @CagatayUlubay 是的 attr(X) 适用于任何属性,但它只返回一个字符串而不是整数/等。 MDN doc
  • 我不想去表格,因为我没有将文本块限制在指定的行中(实际上我正在处理行编号,但我正在将 DNA/蛋白质序列分成块添加加号)。还与表格有关,我确实遇到了等宽字体在连字时没有等宽字体的问题(–修复了它)。我会查看表格,因为它可以防止这两个问题。
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2010-09-21
  • 2019-07-17
  • 2011-01-12
  • 2018-11-01
相关资源
最近更新 更多