Javascript 复制到剪贴板只有在我有断点时才有效
Javascript copy to clipboard only works if I have a breakpoint
我有一个按下按钮时调用的函数:
function copyCredentials(elementId) {
var el = document.createElement('textarea');
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
el.value = document.getElementById(elementId).innerHTML;
var selected = document.getSelection().rangeCount > 0
? document.getSelection().getRangeAt(0)
: false;
el.select();
document.execCommand('copy');
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
}
此代码仅在我放置断点时有效。在正常使用中,它不会复制任何东西......
这里有什么问题?
你能试试这个从 textarea
复制值的函数吗?
function copyCredentials(elementId) {
const value = document.getElementById('textarea_id').value;
const hiddenInput = document.createElement('input');
hiddenInput.setAttribute('value', value);
document.body.appendChild(hiddenInput);
hiddenInput.select();
document.execCommand('copy');
document.body.removeChild(hiddenInput);
}
<textarea id="textarea_id"></textarea>
<button onclick="copyCredentials()">CLICK</button>
Ps。我删除了 rangeCounts
因为我不确定你为什么需要它们。这是什么原因?
您的代码运行良好。我没有删除您的任何代码,我不知道您要做什么,但您可能需要它来做某事。重要的是要强调剪贴板代码必须 运行 在用户执行操作(例如单击按钮)后,这是避免 trolling/improve 安全的措施。
function copyCredentials(elementId) {
var el = document.createElement('textarea');
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
// note that you need to get .value instead
// of .innerHTML if target is input type
el.value = document.getElementById(elementId).innerHTML;
var selected = document.getSelection().rangeCount > 0
? document.getSelection().getRangeAt(0)
: false;
el.select();
// returns boolean
var successfulCopy = document.execCommand('copy');
if (!successfulCopy) {
alert('Something went wrong or no browser support!').
return;
}
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
}
document.getElementById('button').addEventListener('click', e => {
copyCredentials('text');
});
<b>Text to paste:</b>
<div id="text">
Hello World
</div>
<br />
<br />
<button id="button">Copy</button> <br />
<div>
<b>Paste here:</b> <br />
<textarea id="output" rows="10" cols="50"></textarea>
</div>
我尝试了一种不同的方法。我没有创建新元素,而是从原始元素中获取文本(请注意它是 <pre>
标签内的 <code>
标签的内容):
function copyCredentials(elementId) {
var range;
var selection;
var el = document.getElementById(elementId);
if (document.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(el);
range.select();
} else if (window.getSelection) {
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(el);
selection.removeAllRanges();
selection.addRange(range);
}
document.execCommand('copy');
if (selection) {
selection.removeRange(range);
}
}
而且有效!!! :-D
我有一个按下按钮时调用的函数:
function copyCredentials(elementId) {
var el = document.createElement('textarea');
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
el.value = document.getElementById(elementId).innerHTML;
var selected = document.getSelection().rangeCount > 0
? document.getSelection().getRangeAt(0)
: false;
el.select();
document.execCommand('copy');
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
}
此代码仅在我放置断点时有效。在正常使用中,它不会复制任何东西...... 这里有什么问题?
你能试试这个从 textarea
复制值的函数吗?
function copyCredentials(elementId) {
const value = document.getElementById('textarea_id').value;
const hiddenInput = document.createElement('input');
hiddenInput.setAttribute('value', value);
document.body.appendChild(hiddenInput);
hiddenInput.select();
document.execCommand('copy');
document.body.removeChild(hiddenInput);
}
<textarea id="textarea_id"></textarea>
<button onclick="copyCredentials()">CLICK</button>
Ps。我删除了 rangeCounts
因为我不确定你为什么需要它们。这是什么原因?
您的代码运行良好。我没有删除您的任何代码,我不知道您要做什么,但您可能需要它来做某事。重要的是要强调剪贴板代码必须 运行 在用户执行操作(例如单击按钮)后,这是避免 trolling/improve 安全的措施。
function copyCredentials(elementId) {
var el = document.createElement('textarea');
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
// note that you need to get .value instead
// of .innerHTML if target is input type
el.value = document.getElementById(elementId).innerHTML;
var selected = document.getSelection().rangeCount > 0
? document.getSelection().getRangeAt(0)
: false;
el.select();
// returns boolean
var successfulCopy = document.execCommand('copy');
if (!successfulCopy) {
alert('Something went wrong or no browser support!').
return;
}
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
}
document.getElementById('button').addEventListener('click', e => {
copyCredentials('text');
});
<b>Text to paste:</b>
<div id="text">
Hello World
</div>
<br />
<br />
<button id="button">Copy</button> <br />
<div>
<b>Paste here:</b> <br />
<textarea id="output" rows="10" cols="50"></textarea>
</div>
我尝试了一种不同的方法。我没有创建新元素,而是从原始元素中获取文本(请注意它是 <pre>
标签内的 <code>
标签的内容):
function copyCredentials(elementId) {
var range;
var selection;
var el = document.getElementById(elementId);
if (document.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(el);
range.select();
} else if (window.getSelection) {
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(el);
selection.removeAllRanges();
selection.addRange(range);
}
document.execCommand('copy');
if (selection) {
selection.removeRange(range);
}
}
而且有效!!! :-D