Я тоже потратил много времени на поиски решения этой проблемы. Вот что я нашел до сих пор:
Если вы хотите, чтобы пользователи могли нажимать кнопку и копировать текст, возможно, вам придется использовать Flash.
Если вы хотите, чтобы ваши пользователи нажимали Ctrl + C в любом месте страницы, но всегда копировали xyz в буфер обмена, я написал решение для всех JS в YUI3 (хотя его можно легко перенести на другие фреймворки или в необработанный JS, если Вы особенно ненавидите себя).
Это включает создание текстового поля вне экрана, которое подсвечивается, как только пользователь нажимает Ctrl / CMD. Когда они нажимают «С» вскоре после этого, они копируют скрытый текст. Если они нажимают «V», они перенаправляются в контейнер (на ваш выбор) до того, как сработает событие вставки.
Этот метод может работать хорошо, потому что пока вы слушаете нажатие клавиши Ctrl / CMD в любом месте тела, слушатели нажатия клавиш «A», «C» или «V» прикрепляются только к скрытому текстовому полю (а не ко всему тела).
Это также не должно нарушать ожидания пользователей - вы будете перенаправлены только в скрытое поле, если у вас все равно ничего не будет выбрано для копирования!
Вот что у меня работает на моем сайте, но проверьте наличие обновлений http://at.cg/js/clipboard.js, если они есть:
YUI.add('clipboard', function(Y) {
// Change this to the id of the text area you would like to always paste in to:
pasteBox = Y.one('#pasteDIV');
// Make a hidden textbox somewhere off the page.
Y.one('body').append('<input id="copyBox" type="text" name="result" style="position:fixed; top:-20%;" onkeyup="pasteBox.focus()">');
copyBox = Y.one('#copyBox');
// Key bindings for Ctrl+A, Ctrl+C, Ctrl+V, etc:
// Catch Ctrl/Window/Apple keydown anywhere on the page.
Y.on('key', function(e) {
copyData();
// Uncomment below alert and remove keyCodes after 'down:' to figure out keyCodes for other buttons.
// alert(e.keyCode);
// }, 'body', 'down:', Y);
}, 'body', 'down:91,224,17', Y);
// Catch V - BUT ONLY WHEN PRESSED IN THE copyBox!!!
Y.on('key', function(e) {
// Oh no! The user wants to paste, but their about to paste into the hidden #copyBox!!
// Luckily, pastes happen on keyPress (which is why if you hold down the V you get lots of pastes), and we caught the V on keyDown (before keyPress).
// Thus, if we're quick, we can redirect the user to the right box and they can unload their paste into the appropriate container. phew.
pasteBox.select();
}, '#copyBox', 'down:86', Y);
// Catch A - BUT ONLY WHEN PRESSED IN THE copyBox!!!
Y.on('key', function(e) {
// User wants to select all - but he/she is in the hidden #copyBox! That wont do.. select the pasteBox instead (which is probably where they wanted to be).
pasteBox.select();
}, '#copyBox', 'down:65', Y);
// What to do when keybindings are fired:
// User has pressed Ctrl/Meta, and is probably about to press A,C or V. If they've got nothing selected, or have selected what you want them to copy, redirect to the hidden copyBox!
function copyData() {
var txt = '';
// props to Sabarinathan Arthanari for sharing with the world how to get the selected text on a page, cheers mate!
if (window.getSelection) { txt = window.getSelection(); }
else if (document.getSelection) { txt = document.getSelection(); }
else if (document.selection) { txt = document.selection.createRange().text; }
else alert('Something went wrong and I have no idea why - please contact me with your browser type (Firefox, Safari, etc) and what you tried to copy and I will fix this immediately!');
// If the user has nothing selected after pressing Ctrl/Meta, they might want to copy what you want them to copy.
if(txt=='') {
copyBox.select();
}
// They also might have manually selected what you wanted them to copy! How unnecessary! Maybe now is the time to tell them how silly they are..?!
else if (txt == copyBox.get('value')) {
alert('This site uses advanced copy/paste technology, possibly from the future.\n \nYou do not need to select things manually - just press Ctrl+C! \n \n(Ctrl+V will always paste to the main box too.)');
copyBox.select();
} else {
// They also might have selected something completely different! If so, let them. It's only fair.
}
}
});
Надеюсь, кто-то еще найдет это полезным:]