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

如何配置Firefox以允许Javascript截取从剪贴板粘贴的值?,javascript,firefox,windows-vista,configuration-files,onpaste,Javascript,Firefox,Windows Vista,Configuration Files,Onpaste,当用户从剪贴板粘贴时,我需要过滤掉某些字符。(我实际上不想修改剪贴板中的内容。)我已经在IE中进行了此操作。叹气 tl;灾难恢复:能力。策略项在user.js中进入prefs.js但不生效 仅供参考,我可以合理地让所有用户安装user.js。但我们中没有人拥有对机器的管理员访问权限,所以这就是我所能做的关于配置的所有事情 谢谢你的帮助 注意: 出于这个问题的目的,我不想“绕过”访问剪贴板--例如,我不想在粘贴发生后对DOM元素的值进行操作 我不希望解决方案需要一个(如jQuery、Dojo、Pr

当用户从剪贴板粘贴时,我需要过滤掉某些字符。(我实际上不想修改剪贴板中的内容。)我已经在IE中进行了此操作。叹气

tl;灾难恢复:
能力。策略
项在user.js中进入prefs.js但不生效

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

谢谢你的帮助

注意:

  • 出于这个问题的目的,我不想“绕过”访问剪贴板--
    例如,我不想在粘贴发生后对DOM元素的值进行操作
  • 我不希望解决方案需要一个(如jQuery、Dojo、Prototype、YUI等) 遵循的步骤

  • 通过转到URL关于:支持=>配置文件目录=>打开包含文件夹,确定了我的配置文件文件夹的位置

  • 尝试通过以下行创建user.js: 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"); (仅供参考,我还尝试了
    Zallowclipboard
    所有地方,因此
    policynames
    行因字母顺序排列而排在第一位,但这也不起作用。)

  • 尝试在
    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);

    环境(我无法控制)

    • 没有管理员访问计算机的权限
    • Windows Vista
    • Mozilla Firefox 10
    参考资料


    肮脏但交叉的方法是将当前输入值和先前的on onchange事件进行比较

    如果它的长度增加或值差异太大(不仅被删除,而且有很多新字符)——可能是从剪贴板粘贴了一些东西。 大概是这样的:

    $('input, textarea').change(function(){
      var prev = $(this).data('prev-val'), 
          current = $(this).val();
      if (is_big_changes(prev,current)) {
        $(this).val(my_filter_func(current));
      }
      if (!prev) {
         $(this).data('prev-val', current);
      } 
    })
    
    (这只是概念证明,所以我使用jQuery来避免大量编码)

    哪里是大的变化和我的过滤函数——你需要实现的函数


    警告:使用这种方法可能会产生很多有害的bug,我知道,它看起来非常难看。我的任务是提出建议。

    简言之,我认为不可能按照你的意愿去做你想做的事情。Mozilla(和大多数现代浏览器)出于安全原因限制剪贴板访问。你似乎很容易绕过IE中的这个限制,这不是一个令人欣慰的想法

    这就是说,插件有不同于网页的限制,您可以通过编写一个插件(或者甚至利用flash)来绕过这个限制。尽管有了插件,但我怀疑阻止某人将内容粘贴到web表单(或任何东西)的唯一方法是先发制人地擦洗他们的剪贴板

    如果您只想防止某些字符串输入文本框,那么最好监视文本框本身上的事件

    不过,如果我没看错的话,听起来你想强迫用户在表单中键入(并且只键入)某些内容,我想不出一个简单的方法来实现这一点。两个非常重要的选项:

  • 将文本框设置为
    只读
    ,然后弹出一个虚拟键盘,强制用户“键入”到 用鼠标点击盒子。(你必须自己用HTML和 或者在某处找到合适的解决方案。)
  • 监控
    oninput
    事件;如果文本框的变化比一个人能做的更快 合理预期会键入、拒绝更改

  • 这两种方法都不是很好,但是如果你想使用开放式web技术创建解决方案,那么你必须接受你正在构建的系统的局限性以及它的好处。

    我们可以说,你想要的是检测剪贴板粘贴吗?当你知道之前发生了什么,你就知道发生了什么变化


    那么,为什么不简单地钩住onchange呢?不粘贴内容开头和结尾的所有相同字符。如果你想将其与简单的按键区别开来,那么也听听keydown/keypress,你就会知道哪些变化来自“其他地方”。

    我很欣赏Nayjest的尝试,但请看我在问题顶部的“编辑到注释”说明。如果你不喜欢jQuery,Nayjest的方法是正确的(我也不特别喜欢它)如果你说你不想“绕过”访问剪贴板,那么就用纯JavaScript编写同样的代码。为什么?在我看来,唯一的解决方案是检测文本区域/输入上的control-v,然后从那里编辑文本。怎么了?演出除非你真的对文本发狂,否则我怀疑你会看到任何闪烁或任何东西。我在谷歌上搜索了一下这个问题,找到了一些代码,显示了
    nsiclopboard
    nsissupportsString
    nsitransportable
    之后的
    nsiclopboard
    的初始化,也许这会影响你。你到底有什么问题?这听起来可能很奇怪,但也许你正在用你认为可以解决问题的方法来克服你的问题。将
    您想要的作为最终结果公开
    可以为我们提供更多的空间来打开新的解决方案。 Permission denied for <https://my-site.com> to get property XPCComponents.classes var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard); // ...
    $('input, textarea').change(function(){
      var prev = $(this).data('prev-val'), 
          current = $(this).val();
      if (is_big_changes(prev,current)) {
        $(this).val(my_filter_func(current));
      }
      if (!prev) {
         $(this).data('prev-val', current);
      } 
    })