Копировать в буфер обмена с 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, и мне нужно решение, где текст будет копировать на основе нажатия кнопки (многие на одном страница.)

https://stackoverflow.com/questions/4344325/copy-to-clipboard-on-firefox-and-google-chrome/11346026#11346026

мое старое решение было таким:

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 поможет нам получить (безопасное) решение.