JavaScript copy to clipboard not working

前端 未结 5 1105
感动是毒
感动是毒 2021-02-12 22:11

I have a function in my script that gives me an error. The function purpose is to copy text from static panel(not textbox or input) with onClick event.

Uncaught

相关标签:
5条回答
  • 2021-02-12 22:20

    This will allow you to copy the text of an element. Though I have not tested it with complicated layout.

    If you want to use this then remove the alerts and provide a better way to let the user know the content was copied.

    SAFARI: This does not work on Safari before version 10.0. But as of Safari 10.0 this now works.

    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>

    If you want to use this on an <input> or <textarea> element then let me know the code is different.

    The try/catch is for older versions of Safari that would throw an exception. So if you don't plan to support Safari before version 10.0 then you can remove it.

    0 讨论(0)
  • 2021-02-12 22:23

    hi so I looked into it and since you are not using a textInput you cannot just use the .select()function. I borrowed some code from a fellow stack overflow developer Jason on how to highlight an item in 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;
    

    I then modified it to return the range. and with that all you would have to do is

    document.onclick = function(e){
      if(e.target.className === 'click'){
    
          var copytext = SelectText('display');
          document.execCommand("copy");
          alert("Copied the text: " + copytext);
       }
    }
    

    the key part here is that the string passed in to .execCommand() is lower case 'copy'

    0 讨论(0)
  • 2021-02-12 22:27

    select() method is used to select the contents of text fields. it won't work on h1 element.

    0 讨论(0)
  • 2021-02-12 22:39

    Great answer by Intervalia.

    Small improvement to it, sometimes the clicked element is not the one you want to copy.
    So I suggest you pass the id of the element you want to copy.

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

    And then, in the first line of your function do

    element = document.getElementById(element); 
    

    Not much of a difference but I think it's more useful this way.

    0 讨论(0)
  • 2021-02-12 22:42

    A more recent solution (year 2020) uses the new Clipboard API writeText method which is supported by most modern browsers (see Can I use for more details).

    //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>

    0 讨论(0)
提交回复
热议问题