在Javascript中拦截粘贴事件

IT技术 javascript dom copy-paste paste
2021-01-19 01:25:48

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

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

这可能吗?

4个回答

您可以通过附加“onpaste”处理程序来拦截粘贴事件,并window.clipboardData.getData('Text')在 IE 中使用“ ”或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 所指出的,e.originalEvent.clipboardData如果使用 jQuery ,您将需要使用“ ”。

@Veve 如果您对pastedText. 对?
2021-03-22 01:25:48
对于那些像我一样正在寻找最后一块拼图的人“用解析的值设置文本框的值。”,我使用以下内容来做最后的粘贴“document.execCommand("insertText", false, pasteedText );"
2021-03-25 01:25:48
2021-04-09 01:25:48
当我在 IE 中执行上述代码时,但执行以下操作:myElement.Value = pastedText.split(' ').join('');它将值设置为最初粘贴的值。有任何想法吗?我添加了此检查alert(myElement.Value);并返回 true 并且该值在我的警报中看起来正确,但在我的页面上显示不正确。
2021-04-12 01:25:48
通过返回“true”,您允许默认的“粘贴”处理程序发生在您自己的处理程序之后,它只会粘贴文本而不进行任何自定义处理。返回“false”会阻止默认粘贴处理程序运行(这就是我在示例中这样做的原因)。
2021-04-13 01:25:48

碰巧,我今天早些时候回答了一个类似的问题简而言之,当粘贴事件触发时,您需要一个 hack 将插入符号重定向到屏幕外的文本区域。

$(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 和鼠标右键单击粘贴,以下是我在 2017 年 4 月 22 日在 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 然后粘贴,则不会发生修剪。