javascript - Button var 到剪贴板

在下面的函数中有这个 var 链接。通过单击 button 我想将 var 复制到剪贴板。

function displayUser(user) {
    
var text = `Account No.: ${user.userId} <br> Country: ${user.country} <br> 
 "<button onclick="copyToClipboard(link)"> Copy Link</button>"`;
var link = `${user.Url}`;

grid.innerHTML += text;
}

function user(data) {
    data.result.roomList.forEach((user) => displayUser(user));
}

我在这里找到并尝试的是这个功能:

function copyToClipboard(link){
    var dummy = document.createElement("input");
    dummy.style.display = 'none';
    document.body.appendChild(dummy);
    dummy.setAttribute("id", "dummy_id");
    document.getElementById("dummy_id").value=link;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);

通过单击 button 它说“链接未定义”。任何人都知道如何使这项工作?

提前致谢

回答1

你可以这样做。这并没有使复制到剪贴板工作,但这就是您可以将它传递给您想要的函数的方式。

function displayUser(user) {
    
    var grid = document.getElementById("testgrid");
    console.log(grid);

    var link = `${user.Url}`;
    var text = `Account No.: ${user.userId} <br> Country: ${user.country} <br> 
     <button onclick="copyToClipboard('${link}')"> Copy Link</button>`;
    
    grid.innerHTML += text;
}
    
function user(data) {
    data.result.roomList.forEach((user) => displayUser(user));
}

function copyToClipboard(link){
    console.log(link);
    var dummy = document.createElement("input");
    dummy.style.display = 'none';
    document.body.appendChild(dummy);
    dummy.setAttribute("id", "dummy_id");
    document.getElementById("dummy_id").value=link;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}

displayUser({Url: "bla", country: "blabla"});

回答2

我尝试了现在看起来像这样的 Cypherjac 版本。我不再收到错误消息,但剪贴板中也没有结果。

function displayUser(user) {

var link = user.Url;
var text = `Account No.: ${user.userId} <br> Country: ${user.country} <br> 
<button onclick="copyToClipboard(${link})"> Copy Link</button>`;

grid.innerHTML += text;
}

function user(data) {
  data.result.roomList.forEach((user) => displayUser(user));
}

function copyToClipboard(link){
    var dummy = document.createElement("input");
    dummy.style.display = 'none';
    document.body.appendChild(dummy);
    dummy.setAttribute("id", "dummy_id");
    document.getElementById("dummy_id").value=link;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}

然后我尝试了现在看起来像这样的 Chris G 的建议。但也没有错误,也没有结果。还有什么想法吗?

let link;               
            
function displayUser(user) {
    
var text = `Account No.: ${user.userId} <br> Country: ${user.country} <br> 
 "<button onclick="copyToClipboard()"> Copy Link</button>"`;
link = user.Url;

grid.innerHTML += text;
}

function user(data) {
    data.result.roomList.forEach((user) => displayUser(user));
}

function copyToClipboard(){
    var dummy = document.createElement("input");
    dummy.style.display = 'none';
    document.body.appendChild(dummy);
    dummy.setAttribute("id", "dummy_id");
    document.getElementById("dummy_id").value=link;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}

回答3

如果您正在寻找另一种选择,我将提供一个我以前使用过的并且它有效。

因此,该功能也可用于其他浏览器,因此它支持 Edge、Chrome 和 Firefox ... IE 可能也可能不支持

点击一个button,初始化函数时提供的样式为:new clipboardHandler('copy-exec'),它触发一个文档复制函数来选择元素的previousSibling

您当然可以根据自己的需要对其进行调整。

然后还要注意:这两个元素背靠背放置在 HTML 中。那是因为如果你在它们之间放置任何空格,元素的 previousSibling 就会变成那个元素,它基本上是一个 non-breaking space 字符

但是一旦你改变了目标元素:previousSibling,它就会根据你的需要工作

function clipboardHandler(c){
  function copy_relative_text(node){
    if(document.body.createTextRange){
      const range = document.body.createTextRange();
      range.moveToElementText(node);
      range.select();
      document.execCommand('copy');
    }
    else if(window.getSelection){
      const selection = window.getSelection();
      const range = document.createRange();
      range.selectNodeContents(node);
      selection.removeAllRanges();
      selection.addRange(range);
      document.execCommand('copy');
    }
    else {
      console.warn("Could not select text in node");
    }
  }
  function clear_selection(){
    if(window.getSelection){
      window.getSelection().removeAllRanges();
    }
    else if(document.selection){
      document.selection.empty();
    }
  }
  this.clipboard_target = function(){
    var clips = document.getElementsByClassName(c);
    for(var i = 0; i < clips.length; i++){
      clips[i].onclick = function(){
        copy_relative_text(this.previousSibling);
        setTimeout(() => {
          clear_selection();
        }, 500);
        this.innerHTML = 'Copied';
        setTimeout(() => {
          this.innerHTML = 'Copy Link';
        }, 2000);
      };
    }
    return this;
  };
}

let clip = new clipboardHandler('copy-exec')
clip.clipboard_target()
.copy-text {
  margin-bottom: 3px;
}
.copy-exec {
  background-color: teal;
  color: #FFF;
  border-radius: 5px;
  padding: 5px;
  border-style: none;
  margin: 2px;
}
<p class="copy-text">I will be copied to your clipboard!!!</p><button class="copy-exec">Copy Link</button>

回答4

这部分应该是:

function displayUser(user) {
    
    var link = user.Url;
    var text = `Account No.: ${user.userId} <br> Country: ${user.country} <br> 
    "<button onclick="copyToClipboard('${link}')"> Copy Link</button>"`;

    grid.innerHTML += text;
}

function user(data) {
    data.result.roomList.forEach((user) => displayUser(user));
}

变量链接无法访问,因为您在之后定义了它,而且您没有正确地将其括起来

我已更改此部分:

... onclick="copyToClipboard('${link}')" ...

因为在调用函数时,是以实际的value作为参数调用的,所以当用引号括起来时,它将充当字符串

相似文章

php - 一次使用 for 循环数据到 10 行

我找不到这个问题的答案,或者我完全错过了答案,我正在做的是从数据库中循环,只是一个数字value,这个变量$competition['competition_number_of_tickets']可以...

python - python 中带有 Tkinter 模块的 Ludo

嗨,我对python比较陌生,现在我被要求使用其中的Tkinter模块做一个Ludo游戏。我已经尽了最大的努力,开发了掷骰子的棋盘和框架。(后来我了解到使用循环可以使这变得更简单)但是带有骰子的框架卡...

随机推荐

最新文章