15

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

tl;dr: user.jscapability.policy中的项目使其进入prefs.js但未生效。

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

谢谢你的帮助!

笔记:

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

遵循的步骤

  1. 通过转到 URL about:support => Profile Directory =>确定我的个人资料文件夹的位置Open Containing Folder

  2. 尝试通过使用以下行 创建user.js在 Firefox中启用剪贴板:
    user_pref("just.mike", "测试 user.js 是否有效。");
    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 错误 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", "测试 user.js 是否有效。");
      
    (仅供参考,我也尝试Zallowclipboard了所有地方,以便该policynames行由于字母顺序排在第一位,但这也不起作用。)

  4. 在发生以下事件后尝试在 Firefox中读取剪贴板onpaste
    var 剪贴板 = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard);
    如果(!剪贴板){
        throw new Error('内部错误 -- 无法创建剪贴板对象');
    }
    
    var transferable = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
    如果(!可转让){
        throw new Error('内部错误——无法创建可转移对象');
    }
    
    transferable.addDataFlavor("text/unicode");
    clipboard.getData(可转移,clipboard.kGlobalClipboard);
    
    var clipboard_data = new Object();
    var clipboard_length = new Object();
    
    transferable.getTransferData("text/unicode", clipboard_data, clipboard_length);
    
    var 剪贴板文本 = '';
    如果(!!剪贴板数据){
        var clipboard_nsISupportsString = clipboard_data.value.QueryInterface(Components.interfaces.nsISupportsString);
        clipboard_text = clipboard_nsISupportsString.data.substring(0, clipboard_length.value / 2);
    }
    
    返回(剪贴板文本);
    

  5. 代码在第一行失败,在 Firebug 控制台中返回此错误:
    <https://my-site.com> 获取属性 XPCComponents.classes 的权限被拒绝
    
    注意:我实际上是在真实的 URL 上运行它,它确实显示在错误消息中——我只是在这里将它更改为一个虚拟名称。

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


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

  • 没有管理员访问计算机的权限
  • 视窗
  • 火狐浏览器 10

参考

4

3 回答 3

1

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

话虽如此,插件与网页有不同的限制,您可以通过编写一个(或者甚至利用闪存)来绕过这个限制。但是,即使使用插件,我怀疑您阻止某人将某些内容粘贴到 Web 表单(或其他)的唯一方法是抢先清理他们的剪贴板。

如果您只想阻止某些字符串被输入到文本框中,最好的办法是监视文本框本身的事件。

但是,如果我没看错的话,听起来您想强迫用户在表单中输入(并且只输入)某些内容,而我想不出一种简单的方法。几个重要的选择:

  1. 将文本框设置为readonly,并弹出一个虚拟键盘以强制用户使用鼠标在框中“键入”。(您必须自己使用 HTML 和 JavaScript 构建键盘,或者在某个地方找到合适的解决方案。)
  2. 监控oninput事件;如果文本框更改的速度比人们合理预期的要快,则拒绝更改。

这些都不是很漂亮,但是如果您想使用开放的 Web 技术创建解决方案,那么您必须接受您正在构建的系统的局限性,以及它的好处

于 2012-05-31T16:59:24.713 回答
0

我们可以说,您想要的是检测剪贴板粘贴吗?自从你知道那里以前是什么时,你就知道发生了什么变化。

那么为什么不简单地挂钩 onchange 呢?不粘贴内容开头和结尾的所有相同字符。如果您想将此与简单的击键区分开来,请同时听 keydown/keypress,然后您就会知道,哪些更改来自“其他地方”。

于 2012-06-09T11:55:40.430 回答
0

Grubby 但跨浏览器的方法是将当前输入的值与之前的 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 来避免大量编码)

在哪里 is_big_changes 和 my_filter_func - 您需要实现的功能。

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

于 2012-05-18T17:10:22.210 回答