在Javascript中拦截粘贴事件

时间:2011-05-17 17:59:37

标签: javascript dom copy-paste paste

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

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

这可能吗?

4 个答案:

答案 0 :(得分:77)

您可以通过附加“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”。

答案 1 :(得分:3)

碰巧,我今天早些时候回答了similar question。简而言之,当粘贴事件触发时,您需要一个hack来将插入符重定向到屏幕外的textarea。

答案 2 :(得分:1)

$(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');
    }
});

答案 3 :(得分:1)

我需要实施" trim"在粘贴的任何内容上(删除所有前导和尾随空格),同时仍然允许使用空格键。

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

$(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然后粘贴,则不会进行修剪。