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

时间:2010-08-20 12:15:59

标签: javascript jquery javascript-events cross-browser

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

Webkit / IE处理得相当好,因为我可以将代码附加到onpaste事件,然后从剪贴板中读取正在粘贴的内容。 Plenty周围examples

Gecko比较棘手,因为据我所知,无法读取ffox上的剪贴板内容 (除非有人知道解决方法吗?) <登记/> 我只是使用输入交换技巧。

Opera正在讨厌这个问题。我可以捕获 CTRL + V SHIFT + INS ,但是没有onpaste事件。<登记/> 显然,更不用说任何类型的剪贴板交互。

所以,我的问题是:

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

修改

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

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

  • 可以捕获被拖动的内容:mouseup + setTimeout几乎完美无处不在。
  • 没有闪存,可能没有解决方案条状轮询。即使使用闪光灯,它也不是一个完全可靠的解决方案。为支持100%的案件付出太多努力。

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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.
});

直播示例 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);
});

编辑2 鉴于您对原始帖子的修订,如果您担心Opera的giant market share,那么您就是必须使用setInterval()监控文本框的值,并将其与自身进行比较以进行更改。

最终总会有一种解决方案的方法,即使上面的示例也很容易将文本从另一个文本框(或地址栏)拖入其中而不会触发{{1}上面定义的事件。

答案 2 :(得分:3)

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

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

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

<强>被修改 有些浏览器可能不允许我们获取剪贴板内容,在这种情况下,我们总是可以恢复到闪存以借用其跨浏览器的一些功能。查看我在评论中发布的几个链接。

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

答案 3 :(得分:2)

问题的答案很简单。没有paste事件的主要浏览器是Opera和Firefox 2的最新版本。鉴于没有paste事件,您需要找到一个替代事件或一组事件来检测来自该事件的粘贴上下文菜单实际发生。您可以为每个事件添加处理程序(我已经这样做了),当用户从上下文菜单中触发粘贴时,您在相关浏览器中什么也得不到。

这只会定期轮询文本输入的值,这不是一回事。你可以跟踪按键并在你的轮询代码中观察到文本输入的值已经通过除键盘输入以外的某些方式改变并且做了差异,但这很麻烦且不可靠。

答案 4 :(得分:0)

我将setTimeout用于粘贴事件。但是对于上下文菜单选择似乎没有任何工作(如上所述)。我将mousemove绑定到输入的表单,该表单将触发更新功能。然后取消绑定/绑定,这样它们就不会堆叠起来。

这将处理上下文菜单选择并将值拖动到输入字段。

如果您的表单很小,例如只有一个输入字段,并且从上下文菜单中选择后鼠标将不会落在它上,请绑定到表单的父级或文档。当然,它必须等到鼠标移动,但这是从上下文菜单中选择后的一般用户操作。

工作正常。