Raz*_*zor 17 javascript jquery cross-browser dom-events
场景:我正在尝试拦截textarea/input文本中的粘贴事件,并过滤要粘贴的内容.
Webkit/IE处理得相当好,因为我可以将代码附加到onpaste事件中,然后从剪贴板中读取正在粘贴的内容.大量的实例左右.
Gecko比较棘手,因为据我所知,不可能在ffox上读取剪贴板内容 (除非有人知道解决方法吗?)
我只是使用输入交换技巧.
歌剧正在烦人.我可以陷阱CTRL+ V和SHIFT+ INS,但没有onpaste事件.
显然,更不用说任何类型的剪贴板交互了.
所以,我的问题是:
我可以检测用户是否 在Opera的上下文菜单中单击了paste 吗?有没有其他方法来检测事件?
编辑:
感谢大家的答案 - 即使没有明确的解决方案,他们都会增加一个好的输入.
不得不选择,我会选择唯一一个试图解决原始问题的人,如果不是太多的黑客甚至尝试,这可能会有用.
那些有同样问题的人的注释(输入过滤):
mouseup+ setTimeout的伎俩几乎处处完美.您可以在粘贴bind('paste', function() {});之前和之后使用,比较字符串拦截jQuery的粘贴并应用您的格式.
以下是在IE7/FF3.6/Chrome/Safari 5中测试的
$("#textarea").bind('paste', function(e){
// Do whatever you needed to do with the code here.
});
Run Code Online (Sandbox Code Playgroud)
实例 http://jsfiddle.net/VSrTg/2/
编辑方法将是这样的:
$("#textarea").bind('paste', function(e){
var oldText = this.value;
setTimeout(function() {
// Compare oldText to $("#textarea").val() and format accordingly.
}, 1000);
});
Run Code Online (Sandbox Code Playgroud)
编辑2鉴于你修改你原来的职位,如果你担心了巨大的 市场 份额即是Opera,你将有权监督你的文本框的一个值setInterval(),并针对其自身比较更改.
最终总会有一种绕过你的脚本的方法,即使上面的例子也很容易将文本从另一个文本框(或地址栏)拖入其中,而不会触发paste上面定义的事件.
我想指出 DOJO 菜单小部件可以在不同的浏览器中完美地创建上下文菜单。http://www.dojotoolkit.org/reference-guide/dijit/Menu.html#dijit-menu
您可以做的是在支持粘贴事件的浏览器中检测粘贴事件,并在不支持此事件(如 Opera)的浏览器中覆盖上下文菜单。
创建自己的上下文菜单后,您可以添加复制粘贴菜单项或使用 css 创建类似于默认的上下文菜单。
编辑 一些浏览器可能不允许我们获取剪贴板内容,在这种情况下,我们总是可以恢复到Flash以借用它的一些跨浏览器功能。请参阅我在评论中发布的几个链接。
它的完整实现可能会遇到比预期更多的问题,但这是可能的,我们总是可以尝试一下(我肯定会尝试)。