Копировать в буфер обмена с Javascript в Firefox
мне действительно нужен способ скопировать текст в буфер обмена ОС в Firefox.
знайте, что это легко в IE и невозможно в Chrome и Opera, если не используется flash. По разным причинам я не могу использовать вспышку решение!
он работал в прошлом, но теперь netscape.безопасность.PrivilegeManager.enablePrivilege защищен, насколько я могу понять (начиная с ver. 17).
похоже, что это все еще возможно в соответствии с этим статья:
https://developer.mozilla.org/en-US/docs/Using_the_Clipboard
считаю, что по-прежнему необходимо включить возможность в пользователе.JS файл, как это
user_pref("capability.policy.policynames", "allowclipboard");
user_pref("capability.policy.allowclipboard.sites", "http://");
user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
но как мне это сделать? Сделали какой-то тест, без особого успеха и думаю, что нет руководства в интернете, которые объясняют, как это должно быть сделано в общей форме. Е. Г. простое руководство о том, как включить доступ JavaScript к буферу обмена. Надеюсь также руководство, которое может используется начинающим пользователем. Хотелось бы сделать это и опубликовать его здесь, но сначала нужно рабочее решение.
согласно сети существует 2 решения для копирования в буфер обмена;
document.execCommand("copy", false, null)
и
var gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString("Put me on the clipboard, please.");
оба генерируют сбой с моей первой попытки.
Решение ниже нужно пользователю нажать CTRL+C, и мне нужно решение, где текст будет копировать на основе нажатия кнопки (многие на одном страница.)
мое старое решение было таким:
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if(clip)
{
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if(trans)
{
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
if(str)
{
var clipid=Components.interfaces.nsIClipboard;
if(clipid)
{
str.data = cliptext;
trans.addDataFlavor('text/unicode');
trans.setTransferData("text/unicode", str, cliptext.length*2);
clip.setData(trans, null, clipid.kGlobalClipboard); // No return value
return 0;
}
}
}
}
компоненты.классы не определены в непривилегированном коде (не надстройка и т. д.), Поэтому я не верю, что какое-либо решение с этим больше не будет работать. Один из вариантов-сделать надстройку, которая будет выполняться в привилегированной области кода, и отправить текст, который должен быть скопирован в эту надстройку обработайте копию в буфер обмена ОС (хороший новый возможный проект).
это только оставить документ.execCommand ("копировать", false, null) в поле как автономное решение.
пробовал этот код, и он ничего не копирует в буфер обмена ОС - но не генерирует никаких ошибок btw.
var pre = document.getElementById('pcryptcopytext');
if(!pre)
{
pre = document.createElement("pre");
pre.setAttribute('id', 'pcryptcopytext');
pre.setAttribute('style', 'opacity: 0; position: absolute; top: -10000px; right: 0;');
document.body.appendChild(pre);
}
pre.innerHTML = cliptext;
pre.contentEditable = true;
//pre.unselectable = "off";
//pre.focus();
if (document.createRange)
{
var rng = document.createRange();
rng.selectNodeContents(pre);
document.execCommand("copy", false, null);
document.body.removeChild(pre);
}
так, у кого-нибудь есть рабочее решение?
2 ответов
решено путем создания дополнения Firefox, которое предоставляет объект буфера обмена:https://github.com/myplaceonline/myplaceonline_ffclipboard
пример:
if (window.ffclipboard) {
window.ffclipboard.setText("clipboard text");
}
похоже, что это больше не поддерживается, и нет замены :(
https://support.mozilla.org/en-US/questions/977068#answer-500083
возможно, шум в ошибке Firefox поможет нам получить (безопасное) решение.