在jQuery中如何处理oncut、oncopy和onpaste事件?

65

jQuery文档显示该库内置支持以下事件: blur、focus、load、resize、scroll、unload、click、dblclick、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter、mouseleave、change、select、submit、keydown、keypress、keyup 和 error。

我需要处理剪切、复制和粘贴事件。最好的方法是什么?FWIW(注:意思是“为了信息而提供”),我只需要担心WebKit(我的运气!)。

更新:我正在类似Dashboard的环境中开发一个"widget"。它使用WebKit,所以只要这些事件在那里受支持,对于我的目的来说就足够了,看起来它们是被支持的。


在为这个答案做一些研究时,我发现IE通过window.clipboardData支持JavaScript读取剪贴板(!!)。幸运的是,Firefox不支持。我怀疑Webkit也不会支持,因为它很明智。你确定你真的需要处理剪切/复制/粘贴命令吗?也许你从错误的角度来解决问题了。如果你编辑你的答案并提供请求背后的原因,也许我或其他人可以给你更多帮助。 - Michael Gundlach
那么jQuery并没有记录部分支持,比如粘贴和复制等事件。 - ars265
4个回答

93

您可以使用.on()off()方法添加和删除任何类型的事件

例如,试试这个

jQuery(document).on('paste', function(e){ alert('pasting!') });

jQuery实际上并不关心你分配的事件类型是否被浏览器支持,因此你可以为元素(和一般对象)分配任意事件类型,例如:

jQuery('p').on('foobar2000', function(e){ alert(e.type); });

对于自定义事件类型,您必须在代码中“手动”.trigger()它们,例如:

jQuery('p').trigger('foobar2000');

很整洁,是吧?

此外,为了以跨浏览器兼容的方式使用/编写专有/自定义DOM事件,您可能需要使用/编写"jQuery事件插件" ... 其示例可在jquery.event.wheel.js Brandon Aaron的Mousewheel插件中看到。


损坏的链接:offjquery.event.wheel.js - Dave Jarvis
1
.off 链接可以使用,jquery.event.wheel.js 被标记为<del>已删除,但出于历史原因保留在其中。 - Már Örlygsson

14

在JavaScript中有多种剪贴板事件可用,尽管支持不稳定。QuicksMode.org有一个兼容性网格和一个测试页面。这些事件没有通过jQuery公开,因此您将不得不扩展库或使用本机JavaScript事件。


9

Mozilla支持一个“input”事件,但我很难找到有用的文档。至少我知道它会在粘贴时触发。

   this.addEventListener('input',
    function(){//stuff here},
    false
   );

1
谢谢,乔什。这似乎在FF和IE中都可以工作。$('#myinput').bind('input', function() { my_immediate_response_function();}); - Daniel 'Dang' Griffith
在火狐,IE,Chrome和Safari上似乎都很好用!太好了,谢谢。 - mr-euro
3
在IE 9中,如果您使用键盘或右键|剪切删除文本,则输入事件不会触发。而在Chrome和FF中,它会触发。微软做得好! - Daniel Earwicker

1
自 jQuery 1.7 版本开始,您可以使用 bind(...)unbind(...) 方法来分别添加和删除处理程序。
以下是一些示例,以回答您的问题:
$('#someElementId').bind('paste', function(){return false;});

- 这个会阻止从剪贴板粘贴到元素主体的任何尝试。你也可以使用cutcopy和其他事件类型(请参见下面的链接)。
$('#someElementId').bind('copy', function(){return alert('Hey fella! Do not forget about copyrights!');});

因此,在其他情况下,当您想要删除这些处理程序时,可以使用 unbind() 方法:

$('#someElementId').unbind('copy');

这里有一些有用的链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接