【问题标题】:jQuery bind to Paste Event, how to get the content of the pastejQuery绑定到粘贴事件,如何获取粘贴的内容
【发布时间】:2012-07-21 06:27:04
【问题描述】:

我有一个 jquery token tagit 插件,我想绑定到粘贴事件以正确添加项目。

我可以像这样绑定到粘贴事件:

    .bind("paste", paste_input)

...

function paste_input(e) {
    console.log(e)
    return false;
}

如何获取实际粘贴的内容值?

【问题讨论】:

    标签: javascript jquery copy-paste paste


    【解决方案1】:

    在现代浏览器中有一个 onpaste 事件。您可以使用clipboardData 对象上的getData 函数访问粘贴的数据。

    $("#textareaid").bind("paste", function(e){
        // access the clipboard using the api
        var pastedData = e.originalEvent.clipboardData.getData('text');
        alert(pastedData);
    } );
    

    请注意,bindunbind 自 jQuery 3 起已弃用。首选调用 on

    所有现代浏览器都支持Clipboard API

    另见:In Jquery How to handle paste?

    【讨论】:

    • 此代码将在var pastedData = 行:Uncaught TypeError: Cannot read property 'getData' of undefined 上给出错误。您需要将e.clipboardData 更改为e.originalEvent.clipboardData。我怀疑是因为 jquery 将实际的粘贴事件包装在它自己的事件中——不过不要引用我的话。
    • e.originalEvent.clipboardData.getData('text/plain') 为我工作
    • 如果需要,IE的解决方案:window.clipboardData.getData('text')
    • 您可以将事件处理程序添加到pasteinput 事件,在paste 事件处理程序上设置一个标志,并在input 事件处理程序中检查该标志。其中,this.value 是粘贴的值,这在 IE11 中有效。
    【解决方案2】:

    这个怎么样:http://jsfiddle.net/5bNx4/

    如果您使用的是 jq1.7 等,请使用.on

    行为:当您在第一个文本区域输入任何内容或paste 任何内容时,下面的teaxtarea 会捕获变化。

    休息,我希望它有助于事业。 :)

    有用的链接 =>

    How do you handle oncut, oncopy, and onpaste in jQuery?

    Catch paste input

    编辑:
    .on() 中的事件列表应以空格分隔。参考https://api.jquery.com/on/

    代码

    $(document).ready(function() {
        var $editor    = $('#editor');
        var $clipboard = $('<textarea />').insertAfter($editor);
      
        if(!document.execCommand('StyleWithCSS', false, false)) {
            document.execCommand('UseCSS', false, true);
        }
            
        $editor.on('paste keydown', function() {
            var $self = $(this);            
            setTimeout(function(){ 
                var $content = $self.html();             
                $clipboard.val($content);
            },100);
         });
    });
    

    【讨论】:

    • @Raminson 是的,我是 undefined 几天 innit :P
    • 它不支持上下文菜单粘贴(右键单击+粘贴),有什么想法吗?
    【解决方案3】:

    我最近需要完成类似的事情。我使用以下设计来访问粘贴元素和值。 jsFiddle demo

    $('body').on('paste', 'input, textarea', function (e)
    {
        setTimeout(function ()
        {
            //currentTarget added in jQuery 1.3
            alert($(e.currentTarget).val());
            //do stuff
        },0);
    });
    

    【讨论】:

      【解决方案4】:

      另一种方法: input 事件也将捕获 paste 事件。

      $('textarea').bind('input', function () {
          setTimeout(function () { 
              console.log('input event handled including paste event');
          }, 0);
      });
      

      【讨论】:

        【解决方案5】:
        $(document).ready(function() {
            $("#editor").bind('paste', function (e){
                $(e.target).keyup(getInput);
            });
        
            function getInput(e){
                var inputText = $(e.target).html(); /*$(e.target).val();*/
                alert(inputText);
                $(e.target).unbind('keyup');
            }
        });
        

        【讨论】:

          【解决方案6】:

          在现代浏览器上这很简单:只需使用 input 事件和 inputType 属性即可:

          $(document).on('input', 'input, textarea', function(e){
            if (e.originalEvent.inputType == 'insertFromPaste') {
              alert($(this).val());
            }
          });
          

          https://codepen.io/anon/pen/jJOWxg

          【讨论】:

            【解决方案7】:

            您可以比较字段的原始值和字段的更改值,并将差值作为粘贴值扣除。即使字段中存在现有文本,这也会正确捕获粘贴的文本。

            http://jsfiddle.net/6b7sK/

            function text_diff(first, second) {
                var start = 0;
                while (start < first.length && first[start] == second[start]) {
                    ++start;
                }
                var end = 0;
                while (first.length - end > start && first[first.length - end - 1] == second[second.length - end - 1]) {
                    ++end;
                }
                end = second.length - end;
                return second.substr(start, end - start);
            }
            $('textarea').bind('paste', function () {
                var self = $(this);
                var orig = self.val();
                setTimeout(function () {
                    var pasted = text_diff(orig, $(self).val());
                    console.log(pasted);
                });
            });
            

            【讨论】:

              【解决方案8】:

              看起来好像此事件附加了一些clipboardData 属性(它可能嵌套在originalEvent 属性中)。 clipboardData 包含一个项目数组,每个项目都有一个您可以调用的 getAsString() 函数。这将返回项目中内容的字符串表示形式。

              这些项目也有 getAsFile() 函数,以及其他一些特定于浏览器的函数(例如,在 webkit 浏览器中,有一个 webkitGetAsEntry() 函数)。

              出于我的目的,我需要粘贴内容的字符串值。所以,我做了类似的事情:

              $(element).bind("paste", function (e) {
                  e.originalEvent.clipboardData.items[0].getAsString(function (pStringRepresentation) {
                      debugger; 
                      // pStringRepresentation now contains the string representation of what was pasted.
                      // This does not include HTML or any markup. Essentially jQuery's $(element).text()
                      // function result.
                  });
              });
              

              您需要对项目执行迭代,保留字符串连接结果。

              有一系列项目的事实让我认为需要做更多的工作,分析每个项目。您还需要进行一些空值/值检查。

              【讨论】:

              • 你能标记一下这适用于哪些浏览器吗?
              【解决方案9】:

              这适用于所有浏览器以获取粘贴值。以及为所有文本框创建通用方法。

              $("#textareaid").bind("paste", function(e){       
                  var pastedData = e.target.value;
                  alert(pastedData);
              } )
              

              【讨论】:

              猜你喜欢
              • 2012-01-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-02-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多