在Javascript中拦截粘贴事件

有没有办法拦截JavaScript中的粘贴事件,并获取原始值,更改它,并将关联的DOM元素的值设置为修改后的值?

例如,我有一个用户试图复制和粘贴一个string中的空格,string的长度超过了我的文本框的最大长度。 我想拦截文本,删除空格,然后使用更改值设置文本框的值。

这可能吗?

您可以通过附加一个“onpaste”处理程序来拦截粘贴事件,并通过在IE中使用“ window.clipboardData.getData('Text') ”或者在“ event.clipboardData.getData('text/plain') ”其它浏览器。

例如:

 var myElement = document.getElementById('pasteElement'); myElement.onpaste = function(e) { var pastedText = undefined; if (window.clipboardData && window.clipboardData.getData) { // IE pastedText = window.clipboardData.getData('Text'); } else if (e.clipboardData && e.clipboardData.getData) { pastedText = e.clipboardData.getData('text/plain'); } alert(pastedText); // Process and handle text... return false; // Prevent the default handler from running. }; 

如@ pimvdb所示,如果使用jQuery,则需要使用“ e.originalEvent.clipboardData ”。

碰巧,我今天早些时候回答了一个类似的问题 。 总之,当粘贴事件触发时,你需要一个黑客把插入符号redirect到屏幕外的textarea。

 $(document).ready(function() { $("#editor").bind('paste', function (e){ $(e.target).keyup(getInput); }); function getInput(e){ var inputText = $(e.target).val(); alert(inputText); $(e.target).unbind('keyup'); } }); 

我需要实现一个“修剪”的任何被粘贴(删除所有前导和尾随空白),同时仍然允许使用空格键。

对于Ctrl + V,Shift + Insert和鼠标右键单击粘贴,这是我发现在FF,IE11和Chrome的工作从2017-04-22:

 $(document).ready(function() { var lastKeyCode = 0; $('input[type="text"]').bind('keydown', function(e) { lastKeyCode = e.keyCode; }); // Bind on the input having changed. As long as the previous character // was not a space, BS or Del, trim the input. $('input[type="text"]').bind('input', function(e) { if(lastKeyCode != 32 && lastKeyCode != 8 && lastKeyCode != 46) { $(this).val($(this).val().replace(/^\s+|\s+$/g, '')); } }); }); 

两个警告:

  1. 如果在粘贴发生时已经有文本,则会在整个结果上进行修剪,而不仅仅是粘贴的内容。

  2. 如果用户键入空格或BS或Del然后粘贴,则不会发生修剪。