Доступ к буферу обмена с использованием Javascript - без Flash? - PullRequest
10 голосов
/ 09 ноября 2009

Есть ли надежный способ доступа к буферу обмена клиентского компьютера с помощью Javascript? Я продолжаю сталкиваться с проблемами разрешений при попытке сделать это. Как Google Docs делает это? Они используют Flash?

Моя основная цель - IE8, но я хотел бы также поддерживать FF и Chrome.

Я видел технику, чтобы сделать это, используя Flash, но я ищу чистый маршрут js:
Доступ к буферу обмена с использованием Flash

Ответы [ 8 ]

10 голосов
/ 09 ноября 2009

Поскольку это большой риск для безопасности, все браузеры, которые заботятся о безопасности, не позволяют JS получить доступ к буферу обмена.

Основная причина в том, что многие люди помещают свои пароли в текстовый файл, а затем используют метод «вырезать и вставить» для входа в систему. Затем взломщики могут получить пароль (и, возможно, другую личную информацию, например, текстовый документ, который вы только что скопировали) из буфера обмена, взломав популярный сайт и установив JS, который отправит им содержимое буфера обмена.

Именно поэтому у меня постоянно отключена вспышка.

3 голосов
/ 09 ноября 2009

Нет, не в FF, а в Chrome. Он работает в IE (не уверен насчет 7 и 8, но определенно 6) и из Flash. Вот почему Flash всегда используется.

2 голосов
/ 26 сентября 2011

В IE сделать это довольно безболезненно. Для Firefox вам нужно обновить users.js и / или prefs.js (вы можете поискать доступ к буферу обмена в Firefox через Google). Для Chrome вам нужно написать расширение.

В вашем расширении background_page есть заполнитель (IFrame) на вашей веб-странице есть кнопки или ссылки, такие как «вырезать», «копировать» и «вставить». Также на вашей странице есть скрытый iframe paste_holder, чтобы вернуть текст, прочитанный background_page вашего расширения. В файле манифеста вашего расширения используйте следующий код:

manifest.json

"background_page": "mypaste_helper.html",
"content_scripts": [
    {
        "matches": ["<all_urls>"],
        "js": ["mypaste_helper.js"],
        "all_frames": true
    }
],
"permissions": [
    "clipboardRead",
    "clipboardWrite",
    "tabs"  
]

mypaste_helper.js

получить ссылки на кнопки вырезания, копирования и копирования на странице

cutButton.addEventListener("click", function() 
{
            get selected content using window.getSelection()
            pass that text to handleCut function in mypaste_helper.html     
}, false);      
copyButton.addEventListener("click", function() 
{
            get selected content using window.getSelection()
            pass that text to handleCopy function in mypaste_helper.html 
}, false);      
pasteButton.addEventListener("click", function() 
{
            get content from handlePaste function in mypaste_helper.html 
}, false);    

в функции обратного вызова

получить содержимое, отправленное функцией background_page установить innerHTML для документа frame.body фрейма paste_holder с полученным текстом.

mypaste_helper.html

handleCopy и handleCut идентичны

get reference to your iframe document.body as clipboardholder
set innerHTML of the clipboardholder.contentDocument.body with the data passed by mypaste_helper.js
capture selection through window.getSelection()
selection.selectAllChildren(clipboardholder);
document.execCommand('copy')
read contents of the clipboardholder
pass the text back to callback in mypaste_helper.js

handlePaste

get reference to your iframe document.body as clipboardholder
you may want to clear the contents of clipboardholder.contentDocument.body
capture selection through window.getSelection()
selection.selectAllChildren(clipboardholder);
document.execCommand('paste')
read contents of the clipboardholder
pass the text back to callback in mypaste_helper.js
2 голосов
/ 09 ноября 2009

Вы ищете функцию execCommand, по крайней мере, лучшее, что я могу сказать. Вот некоторые ресурсы: Вставить текст в Javascript contenteditable div http://www.java2s.com/Code/JavaScriptReference/Javascript-Methods/execCommandisappliedto.htm

К сожалению, это наталкивается на ту же лазейку в безопасности, что и Flash, запечатанный во Flash 9. Поскольку люди занимались спамом в буфере обмена, буфер обмена теперь доступен только через прямое взаимодействие с пользователем, и, честно говоря, так лучше. И я держу пари, что большинство браузеров имеют аналогичные (если не более строгие правила).

2 голосов
/ 09 ноября 2009

Забудь о чистом JS.

Не существует стандартного API для доступа к буферу обмена, и лишь немногие браузеры реализуют соответствующий метод.

Flash - это «стандартный» метод.

1 голос
/ 25 июня 2010

http://www.rodsdot.com/ee/cross_browser_clipboard_copy_with_pop_over_message.asp правильно реализует флеш-объект ZeroClipboard и является кросс-браузерным. Также обсуждаются потенциальные проблемы с ZeroClipboard и возможные обходные пути. Также совместим с Flash 10+.

0 голосов
/ 05 ноября 2014

Эта проблема была ясна, но у меня все еще есть сомнения, потому что есть возможность сделать это в javascript, а другая вещь для оконных форм, это вполне возможно сделать с помощью команды

Clipboard.Clear()

Ссылка: System.Windows.Forms

Любое вредоносное ПО, которое может хорошо работать.

0 голосов
/ 21 сентября 2011

Вот чистая реализация JS, которая позволяет вставлять данные изображений, которые работают в Google Chrome: http://strd6.com/2011/09/html5-javascript-pasting-image-data-in-chrome/

...