JavaScript复制到剪贴板不起作用

时间:2017-12-21 19:49:10

标签: javascript html dom copy-paste

我的脚本中有一个函数给我一个错误。功能目的是使用onClick事件从静态面板(而不是文本框或输入)复制文本。

未捕获的TypeError:copyText.select不是函数

我想要的是让用户能够点击文本并将其复制到他的剪贴板。

也许你可以提供更好的功能吗?

https://codepen.io/abooo/pen/jYMMMN?editors=1010

function myFunction() {
  var copyText = document.getElementById("display");
  copyText.select();
  document.execCommand("Copy");
  alert("Copied the text: " + copyText.value);
}

来自w3schools

5 个答案:

答案 0 :(得分:12)

较新的解决方案(2020年)使用了新的Clipboard API writeText method,大多数现代浏览器都支持此功能(有关更多详细信息,请参见Can I use)。

//If you want to copyText from Element
function copyTextFromElement(elementID) {
  let element = document.getElementById(elementID); //select the element
  let elementText = element.textContent; //get the text content from the element
  copyText(elementText); //use the copyText function below
}

//If you only want to put some Text in the Clipboard just use this function
// and pass the string to copied as the argument.
function copyText(text) {
  navigator.clipboard.writeText(text);
}
<div id="mytext">This is some text that needs to be copied</div>
<button onclick="copyTextFromElement('mytext')">Copy</button>

答案 1 :(得分:8)

这将允许您复制元素的文本。虽然我没有用复杂的布局测试它。

如果您想使用此功能,请删除提醒并提供更好的方式让用户知道内容已被复制。

  

SAFARI:这在版本10.0之前的Safari上不起作用。但是从Safari 10.0开始,现在可行了。

function copyText(element) {
  var range, selection, worked;

  if (document.body.createTextRange) {
    range = document.body.createTextRange();
    range.moveToElementText(element);
    range.select();
  } else if (window.getSelection) {
    selection = window.getSelection();        
    range = document.createRange();
    range.selectNodeContents(element);
    selection.removeAllRanges();
    selection.addRange(range);
  }
  
  try {
    document.execCommand('copy');
    alert('text copied');
  }
  catch (err) {
    alert('unable to copy text');
  }
}
<h1 id='display' onClick='copyText(this)'>Text Sample</h1>

如果您想在<input><textarea>元素上使用此功能,请告知我代码不同。

try / catch适用于旧版Safari,会引发异常。因此,如果您不打算在10.0版之前支持Safari,则可以将其删除。

答案 2 :(得分:3)

Intervalia的回答很好。

对其进行了小的改进,有时单击的元素不是您要复制的元素。
因此,我建议您传递要复制的元素的ID。

<button onClick='copyText("display")'> Copy </button>
<h1 id='display'> Text Sample </h1>

然后,在函数的第一行中

element = document.getElementById(element); 

没什么区别,但是我认为这种方式更有用。

答案 3 :(得分:0)

select()方法用于选择文本字段的内容。它不会在h1元素上工作。

答案 4 :(得分:0)

嗨所以我调查了它,因为你没有使用textInput,所以你不能只使用.select()函数。我从堆栈溢出开发人员Jason那里借用了一些关于如何在javaScript中突出显示项目的代码

selecting text in an element akin to highlighting with your mouse.

function selectedText(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);   
}

return range;

然后我修改它以返回范围。 并且你需要做的就是

document.onclick = function(e){
  if(e.target.className === 'click'){

      var copytext = SelectText('display');
      document.execCommand("copy");
      alert("Copied the text: " + copytext);
   }
}

这里的关键部分是传递给.execCommand() is lower case 'copy'

的字符串