拦截Javascript中的粘贴事件

发布于 2024-11-08 00:49:04 字数 163 浏览 5 评论 0原文

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

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

这可能吗?

Is there a way to intercept the paste event in JavaScript and get the raw value, change it, and set the associated DOM element's value to be the modified value?

For instance, I have a user trying to copy and paste a string with spaces in it and the string's length exceeds the max length of my text box. I want to intercept the text, remove the spaces, and then set the text box's value with the change value.

Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

舂唻埖巳落 2024-11-15 00:49:04

您可以通过附加“onpaste”处理程序来拦截粘贴事件,并通过在 IE 中使用“window.clipboardData.getData('Text')”或“event.clipboardData.getData('Text')”获取粘贴的文本。 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”。

You can intercept the paste event by attaching an "onpaste" handler and get the pasted text by using "window.clipboardData.getData('Text')" in IE or "event.clipboardData.getData('text/plain')" in other browsers.

For example:

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.
};

As @pimvdb notes, you will need to use "e.originalEvent.clipboardData" if using jQuery.

甜嗑 2024-11-15 00:49:04

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

As it happens, I answered a similar question earlier today. In short, you need a hack to redirect the caret to an off-screen textarea when the paste event fires.

待"谢繁草 2024-11-15 00:49:04
$(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');
    }
});
$(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');
    }
});
鹿港巷口少年归 2024-11-15 00:49:04

我需要对粘贴的内容进行“修剪”(删除所有前导和尾随空格),同时仍然允许使用空格键。

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

I needed to implement a "trim" on whatever was pasted (remove all leading and trailing whitespace) while still allowing the use of the spacebar.

For Ctrl+V, Shift+Insert and mouse right-click Paste, here is what I found worked in FF, IE11 and Chrome as of 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, ''));
        }
    });
});

Two caveats:

  1. If there is already text when the paste occurs, trimming occurs on the entire result, not just what it being pasted.

  2. If the user types space or BS or Del and then pastes, trimming will not occur.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文