如何配置Firefox以允许Javascript截取从剪贴板粘贴的值?
当用户从剪贴板粘贴时,我需要过滤掉某些字符。(我实际上不想修改剪贴板中的内容。)我已经在IE中进行了此操作。叹气 tl;灾难恢复:如何配置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
能力。策略
项在user.js中进入prefs.js但不生效
仅供参考,我可以合理地让所有用户安装user.js。但我们中没有人拥有对机器的管理员访问权限,所以这就是我所能做的关于配置的所有事情
谢谢你的帮助
注意:
例如,我不想在粘贴发生后对DOM元素的值进行操作
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
$('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);
}
})