jQuery绑定到粘贴事件,如何获取粘贴的内容


75

我有一个jquery令牌tagit插件,我想绑定到paste事件以正确添加项目。

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

    .bind("paste", paste_input)

...

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

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

Answers:


145

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

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

请注意,从jQuery 3开始不推荐使用bindunbind。首选的调用是on

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

另请参阅:在Jquery中如何处理粘贴?


7
此代码将在以下var pastedData =行给出错误:Uncaught TypeError: Cannot read property 'getData' of undefined。您需要更改e.clipboardDatae.originalEvent.clipboardData。我怀疑是因为jquery在它自己的事件中包装了实际的粘贴事件-尽管不要在上面引用我。
FireWingLead 2015年

1
e.originalEvent.clipboardData.getData('text/plain')为我工作
Sridhar

3
如果需要,适用于IE的解决方案:window.clipboardData.getData('text')
DdW

您可以向pasteinput事件添加事件处理paste程序,在事件处理程序上设置标志,然后在事件处理程序中检查该标志input。在其中,this.value是粘贴的值,这在IE11中有效。
Niloct

19

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

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

行为:当您paste在第一个文本区域中键入任何内容时,下面的teaxtarea会捕获到cahnge。

休息,我希望它可以帮助事业。 :)

有用的链接=>

您如何在jQuery中处理oncut,oncopy和onpaste?

捕捉粘贴输入

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

1
@Raminson是啊,我是undefined为几天是吗:P
Tats_innit

1
它不能满足上下文菜单的粘贴(右键单击+粘贴),对此有什么想法吗?
0_o 17-10-27

11

我最近需要完成与此类似的操作。我使用以下设计来访问粘贴元素和值。jsFiddle演示

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


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


1

您可以将字段的原始值与字段的更改后的值进行比较,然后减去差异作为粘贴值。即使字段中存在现有的文本,这也可以正确捕获粘贴的文本。

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

1

似乎此事件具有clipboardData附加的属性(它可能嵌套在该originalEvent属性中)。在clipboardData包含项目的数组和这些项目中的每一个都有一个getAsString()功能,您可以调用。这将返回项目中内容的字符串表示形式。

这些项目也具有getAsFile()功能,以及一些其他特定于浏览器的webkitGetAsEntry()功能(例如,在Webkit浏览器中,具有功能)。

出于我的目的,我需要粘贴的字符串值。因此,我做了类似的事情:

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

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

有很多项目的事实使我认为分析每个项目需要做更多的工作。您还需要进行一些null / value检查。


1
您能标记适用于哪些浏览器吗?
Owen Beresford 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.