Как скопировать в буфер обмена HTML5 без использования flash?
Я хочу использовать функцию copy-to-clipboard в HTML5, но без использования flash. Является ли это возможным? Как?
Я попытался реализовать функцию copy-to-clipboad с JavaScript, но она не работает:
function Copytoclipboard() {
var body = document.body,
range, sel;
if (document.createRange && window.getSelection) {
range = document.createRange();
sel = window.getSelection();
sel.removeAllRanges();
try {
range.selectNodeContents(el);
sel.addRange(range);
document.execCommand('Copy');
} catch (e) {
range.selectNode(el);
sel.addRange(range);
document.execCommand('Copy');
}
} else if (body.createTextRange) {
range = body.createTextRange();
range.moveToElementText(el);
range.select();
range.execCommand('Copy');
}
}
Ответы
Ответ 1
Вы можете использовать HTML5 clipboard api
http://www.htmlgoodies.com/html5/other/working-with-clipboard-apis-in-html5-web-apps.html#fbid=eh9tM7GHJWF
Но обратите внимание, что не все браузеры полностью поддерживают его на данный момент: http://caniuse.com/#feat=clipboard
Ответ 2
ОБНОВЛЕНИЕ: Это решение теперь работает в текущей версии всех основных браузеров!
Я не думаю, что для этого пока есть кросс-браузерное решение без флеш-памяти. Вот решение, которое работает по крайней мере в последних версиях Chrome, Firefox и Edge:
function copyText(text){
function selectElementText(element) {
if (document.selection) {
var range = document.body.createTextRange();
range.moveToElementText(element);
range.select();
} else if (window.getSelection) {
var range = document.createRange();
range.selectNode(element);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
}
}
var element = document.createElement('DIV');
element.textContent = text;
document.body.appendChild(element);
selectElementText(element);
document.execCommand('copy');
element.remove();
}
var txt = document.getElementById('txt');
var btn = document.getElementById('btn');
btn.addEventListener('click', function(){
copyText(txt.value);
})
<input id="txt" />
<button id="btn">Copy To Clipboard</button>
Ответ 3
Он не работает, потому что для него требуется взаимодействие с пользователем, например щелчок. В противном случае document.execCommand
не будет работать. Вы также можете проверить clipboard.js, это супер простая библиотека для копирования текста в буфер обмена, который не требует Flash.
Ответ 4
Функция для вставки текста в буфер обмена:
function copyStringToClipboard (string) {
function handler (event){
event.clipboardData.setData('text/plain', string);
event.preventDefault();
document.removeEventListener('copy', handler, true);
}
document.addEventListener('copy', handler, true);
document.execCommand('copy');
}
Ответ 5
Если вам все равно, что содержимое текстового поля будет выбрано до копирования, вот двухстрочное решение, которое работает хотя бы в Chrome 56 и Edge, но я уверен, что он работает и в других браузерах.
function clickListener() {
document.getElementById('password').select();
document.execCommand('copy');
}
document.getElementById('copy_btn').addEventListener('click', clickListener);
<input id=password value="test">
<button id=copy_btn>Copy</button>
Ответ 6
Вы можете использовать Clipboard.js, чтобы добавить копию в буфер обмена. Эта работа без вспышки взглянуть на код, который я использую:
//for copy to clickboard
var els = document.querySelectorAll('pre');
for (var i=0; i < els.length; i++) {
//for CLIPBOARD
var atr = els[i].innerHTML;
els[i].setAttribute("data-clipboard-text", atr);
//For SELECT
var ids = "elementID"+[i]
els[i].setAttribute("id", ids);
els[i].setAttribute("onclick","selectText(this.id)");
}
var btns = document.querySelectorAll('pre');
var clipboard = new ClipboardJS(btns);
clipboard.on('success', function(e) {
console.log(e);
});
clipboard.on('error', function(e) {
console.log(e);
});
//for select
function selectText(id){
var sel, range;
var el = document.getElementById(id); //get element id
if (window.getSelection && document.createRange) { //Browser compatibility
sel = window.getSelection();
if(sel.toString() == ''){ //no text selection
window.setTimeout(function(){
range = document.createRange(); //range object
range.selectNodeContents(el); //sets Range
sel.removeAllRanges(); //remove all ranges from selection
sel.addRange(range);//add Range to a Selection.
},1);
}
}else if (document.selection) { //older ie
sel = document.selection.createRange();
if(sel.text == ''){ //no text selection
range = document.body.createTextRange();//Creates TextRange object
range.moveToElementText(el);//sets Range
range.select(); //make selection.
}
}
}
<pre>I Have To Copy it<pre>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/clipboard.min.js"></script>