【问题标题】:How do I capture the input value on a paste event?如何捕获粘贴事件的输入值?
【发布时间】:2011-10-17 15:55:28
【问题描述】:

在我的网站上,用户可以将文本(在本例中为 url)粘贴到输入字段中。我想捕获使用 jQuery 粘贴的文本的值。我已经使用下面的代码让它在 FF 中工作,但它在 IE 中不起作用(我认为 IE 不支持“粘贴”事件)。

有谁知道如何在所有现代浏览器中实现这一点?我在 SO 上找到了其他一些答案,但大多数都是 FF 专用的,似乎没有一个提供完整的解决方案。

这是我目前的代码:

$("input.url").live('paste', function(event) {
    var _this = this;
    // Short pause to wait for paste to complete
    setTimeout( function() {
        var text = $(_this).val();
        $(".display").html(text);
    }, 100);
});

JSFiddle:http://jsfiddle.net/TZWsB/1/

【问题讨论】:

标签: javascript jquery html


【解决方案1】:

也许尝试改用onblur 事件。因此,用户 c/p 进入输入,当他们离开该字段时,脚本会检查那里的内容。这可以节省很多麻烦,因为它适用于鼠标和键 c/p 以及手动输入的输入。

【讨论】:

  • 感谢@qw3n。问题是页面上只有 url 字段,所以我敢肯定会有用户只是粘贴 url 并点击提交(不离开该字段)的情况。
  • @rolling stone 好吧,你可以做一个两管齐下的检查。获取onsubmit 事件并检查输入。如果为空返回 true,否则返回 false。问题是你必须做一些事情来防止函数运行两次。由于onblur 事件仍将触发。当您从一个函数触发事件时,可能有布尔切换变量。希望这是有道理的。这是一个复杂的问题,但我认为不如替代方案那么复杂。
【解决方案2】:

jQuery 在 IE 中的 paste-event 的 live-method 有问题;解决方法:

$(document).ready(function() {
    $(".url").bind('paste', function(event) {
        var _this = this;
        // Short pause to wait for paste to complete
        setTimeout( function() {
            var text = $(_this).val();
            $(".display").html(text);
        }, 100);
    });
});

小提琴:http://jsfiddle.net/Trg9F/

【讨论】:

  • +1 感谢@scessor,这对了解很有帮助。问题是我让用户动态添加更多输入,所以我需要 live 方法。除了将涉及隐藏输入的解决方案组合在一起之外,还有其他方法可以使这项工作与现场一起工作吗?
  • 我有一个没有live的解决方案:当你动态添加输入时,你可以解除所有节点与类url的绑定,并再次绑定粘贴事件;不是很好,但很简单。
  • 2016 和 Chrome 也有同样的问题。在我找到这篇文章之前,我想了几分钟我做错了什么。谢谢你的回答,很有帮助!
  • 这对于常规 javascript 也是如此
【解决方案3】:

收听change 事件以及pastechange 将在提交之前可靠地触发更改的字段,而 paste 仅发生在支持显式粘贴的浏览器上;它不会被其他编辑操作触发,例如拖放、剪切复制、撤消重做、拼写检查、IME 替换等。

change 的问题在于它不会立即触发,只有在字段中的编辑完成时才会触发。如果您想在所有更改发生时捕获所有更改,则事件将是input...,但这是一个并非所有地方都支持的新 HTML5 功能(特别是:IE

$('.url').bind('input change paste keyup mouseup',function(e){
    ...
});

但是,如果您想绝对在不支持input 的浏览器上快速捕获所有更改,您别无选择,只能轮询setInterval 上的值。

【讨论】:

  • +1 感谢@bobince!我可能应该提到所有用户将在此输入字段中执行(嗯,我应该说应该执行)正在粘贴 url。看起来我错了,IE确实支持“粘贴”,只是在“实时”和“粘贴”方面存在一些问题。我的问题是我正在根据他们粘贴的 url 动态生成一些内容,这些内容我想显示给用户,以确保在他们提交之前它是正确的。事实上,我实际上是在粘贴 url 时禁用提交按钮,直到完成所有操作的 jQuery 函数完成。任何建议将不胜感激!
  • 是的,onpaste 在 IE 中的某些情况下不会冒泡,而 jQuery 的 live 使用事件委托,这需要冒泡。还有其他特定于浏览器的问题,例如 onpaste 无法在 Safari 的 textareas 中触发。无论兼容性问题如何,我都建议允许以用户选择的任何方式(包括直接键入和拖放)来填写字段,而不是专门针对粘贴操作。
  • 感谢@bobince,肯定会考虑到这一点。change 是捕获拖放的最佳事件吗?
  • @bobince,谢谢,'input' 事件在 IE8 中不可用。我发现 'drop' 事件很有帮助。它适用于 IE8/9/10、Chrome、FF。
【解决方案4】:

更好的是使用 e.originalEvent.clipboardData.getData('text');检索粘贴的数据;

$("input").on("paste", function(e) { 
    var pastedData = e.originalEvent.clipboardData.getData('text');
    // ... now do with pastedData whatever you like ...
});

这样可以避免超时,所有主流浏览器都支持。

【讨论】:

  • 我喜欢这个想法,但对我来说,e.originalEvent 有很多属性,但它没有 clipboardData 字段/属性 :( [仅供参考,我使用的是 Microsoft TypeSafe & JQuery 3.1.1 & jQuery UI 1.12.1写我的Javascript。]
【解决方案5】:
$('input').on('paste', function(e) {
    // common browser -> e.originalEvent.clipboardData
    // uncommon browser -> window.clipboardData
    var clipboardData = e.clipboardData || e.originalEvent.clipboardData || window.clipboardData;
    var pastedData = clipboardData.getData('text');
});

【讨论】:

  • 在我搜索过的所有解决方案中,目前看来只有这个对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多