javascript上下文菜单点击事件/检测 - 过滤粘贴内容

Raz*_*zor 17 javascript jquery cross-browser dom-events

场景:我正在尝试拦截textarea/input文本中的粘贴事件,并过滤要粘贴的内容.

Webkit/IE处理得相当好,因为我可以将代码附加到onpaste事件中,然后从剪贴板中读取正在粘贴的内容.大量实例左右.

Gecko比较棘手,因为据我所知,不可能在ffox上读取剪贴板内容 (除非有人知道解决方法吗?)
我只是使用输入交换技巧.

歌剧正在烦人.我可以陷阱CTRL+ VSHIFT+ INS,但没有onpaste事件.
显然,更不用说任何类型的剪贴板交互了.

所以,我的问题是:

我可以检测用户是否 在Opera的上下文菜单中单击了paste 吗?有没有其他方法来检测事件?

编辑:

感谢大家的答案 - 即使没有明确的解决方案,他们都会增加一个好的输入.
不得不选择,我会选择唯一一个试图解决原始问题的人,如果不是太多的黑客甚至尝试,这可能会有用.

那些有同样问题的人的注释(输入过滤):

  • 可以捕捉的内容被拖拽:mouseup+ setTimeout的伎俩几乎处处完美.
  • 没有闪存,可能没有解决方案栏轮询.即使使用闪光灯,它也不是一个完全可靠的解决方案.太多的努力来支持100%的案件.

Oll*_*rds 9

我去年遇到了这个问题.简而言之,没有.

我最终使用了一个onchange处理程序,并在将内容粘贴到文本框后对其进行过滤.


Rob*_*ert 6

您可以在粘贴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上面定义的事件.


Aya*_*avi 3

我想指出 DOJO 菜单小部件可以在不同的浏览器中完美地创建上下文菜单。http://www.dojotoolkit.org/reference-guide/dijit/Menu.html#dijit-menu

您可以做的是在支持粘贴事件的浏览器中检测粘贴事件,并在不支持此事件(如 Opera)的浏览器中覆盖上下文菜单。

创建自己的上下文菜单后,您可以添加复制粘贴菜单项或使用 css 创建类似于默认的上下文菜单。

编辑 一些浏览器可能不允许我们获取剪贴板内容,在这种情况下,我们总是可以恢复到Flash以借用它的一些跨浏览器功能。请参阅我在评论中发布的几个链接。

它的完整实现可能会遇到比预期更多的问题,但这是可能的,我们总是可以尝试一下(我肯定会尝试)。