如何配置Firefox以允许Javascript截取从剪贴板粘贴的值?

jus*_*ike 14 javascript firefox configuration-files windows-vista onpaste

当用户从剪贴板粘贴时,我需要过滤掉某些字符.(我实际上并不想修改剪贴板中的内容.)我已经在IE中使用了这个.叹了口气 ......

tl; dr: user.js中的capability.policy项目使其成为prefs.js但未生效.

仅供参考,我可以合理地让所有用户安装user.js的.但是我们都没有管理员访问我们的机器,所以这就是我可以做的关于配置的所有事情.

谢谢你的帮助!

注意:

  1. 出于这个问题的目的,我不想"绕过"访问剪贴板 -
    例如,我不想粘贴发生 对DOM元素的值进行操作
  2. 我不想要一个需要框架/库的解决方案(比如jQuery,Dojo,Prototype,YUI,......)

遵循的步骤

  1. 通过转到以下URL来确定我的个人资料文件夹的位置:support =>个人资料目录=>Open Containing Folder

  2. 试图通过使用以下行创建user.js在Firefox中启用剪贴板:
    user_pref("just.mike", "test to see if user.js works.");
    user_pref("capability.policy.policynames", "allowclipboard");
    user_pref("capability.policy.allowclipboard.sites", "https://my-site.com");
    user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
    user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess");
    
    注意:https://my-site.com不是真正的网站.

  3. 事实证明,使用about:config不到capability.policy项目- 由于Bugzilla Bug 284673 - about:config隐藏"capability.policy"首选项.但是,我确实认为这些user.js项目"工作"并且文件位于正确的文件夹中,因为之后:
    • about:config显示just.mike条目
    • prefs.js包含所有新行,但顺序不同 - 按字母顺序排列:
      user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
      user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess");
      user_pref("capability.policy.allowclipboard.sites", "https://my-site.com");
      user_pref("capability.policy.policynames", "allowclipboard");
      ...
      user_pref("just.mike", "test to see if user.js works.");
      
    (仅供参考,我也Zallowclipboard到处尝试过,policynames因为字母顺序排在第一位,但这也不起作用.)

  4. 事件发生后尝试使用以下内容读取 Firefox中的剪贴板onpaste:
    var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard);
    if (!clipboard) {
        throw new Error('internal error -- could not create clipboard object');
    }
    
    var transferable = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
    if (!transferable) {
        throw new Error('internal error -- could not create transferable object');
    }
    
    transferable.addDataFlavor("text/unicode");
    clipboard.getData(transferable, clipboard.kGlobalClipboard);
    
    var clipboard_data = new Object();
    var clipboard_length = new Object();
    
    transferable.getTransferData("text/unicode", clipboard_data, clipboard_length);
    
    var clipboard_text = '';
    if (!!clipboard_data) {
        var clipboard_nsISupportsString = clipboard_data.value.QueryInterface(Components.interfaces.nsISupportsString);
        clipboard_text = clipboard_nsISupportsString.data.substring(0, clipboard_length.value / 2);
    }
    
    return(clipboard_text);
    

  5. 代码在第一行失败,在Firebug控制台中返回此错误:
    Permission denied for <https://my-site.com> to get property XPCComponents.classes
    
    注意:我实际上是在真实的URL上运行它,它会显示在错误消息中 - 我刚刚将其更改为虚拟名称.

  6. 我还看到了第一行使用的其他一些示例createInstance而不是getService,但第一行仍然生成相同的错误文本:
    var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
    // ...
    


环境 (这是我无法控制的)

  • 没有管理员访问计算机
  • Windows Vista
  • Mozilla Firefox 10

参考

Nay*_*est 0

Grubby 但跨浏览器的方式是将当前输入的值与 onchange 事件上的先前输入的值进行比较。

\n\n

如果它的长度增加或值相差太大(不仅是 redu\xd1\x81ed 而且有很多新字符)——可能是从剪贴板粘贴了某些内容。\n类似这样的内容:

\n\n
$('input, textarea').change(function(){\n  var prev = $(this).data('prev-val'), \n      current = $(this).val();\n  if (is_big_changes(prev,current)) {\n    $(this).val(my_filter_func(current));\n  }\n  if (!prev) {\n     $(this).data('prev-val', current);\n  } \n})\n
Run Code Online (Sandbox Code Playgroud)\n\n

(这只是概念证明,所以我使用 jQuery 来避免大量编码)

\n\n

其中 is_big_changes 和 my_filter_func ——您需要实现的函数。

\n\n

警告这种方法可能会出现很多邪恶的错误,而且我知道,它看起来非常难看。我的交易是提出。

\n