0

之后如何正确执行if语句bind()事件发生

看来我的代码不会在我的输入字段中执行 youtube 链接开头的if 语句。paste

这是我的http://jsfiddle.net/6Z3xP/1/

这仅在我连续两次粘贴链接时才有效。

$(document).ready(function () {
    var textval = $('#input');
    var youtube = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i;

    $("#input").bind('paste', function () {
        if (youtube.test(textval.val())) {
            var yurl = textval.val().match(youtube)[0];
            alert(yurl);
        }
    });
});

我尝试添加$(document).ready(function()在绑定后立即添加。但我似乎无法让它工作。

背景信息:我想在粘贴用户的 youtube 链接时捕获一个 youtube url

4

3 回答 3

2

触发粘贴事件时,输入的值不会立即可用,您需要将代码延迟片刻以使其可用。

小提琴:http: //jsfiddle.net/8Pvr4/1/

唯一的变化是绑定回调中的代码现在包含在:

setTimeout(function() {

},0);

更可靠的方法是通过以下方式从事件对象中获取值:

e.originalEvent.clipboardData.getData('text/plain');

所以你的绑定会变成:

$("#input").bind('paste', function(e) {
    var val = e.originalEvent.clipboardData.getData('text/plain');
    if (youtube.test(val)) {
        var yurl = val.match(youtube)[0];
        alert(yurl);
    }            
});

小提琴:http: //jsfiddle.net/8Pvr4/3/

于 2013-10-26T17:02:30.817 回答
0

问题是粘贴事件发生在输入文本之前:

在 Jquery 如何处理粘贴?

这是一个更正的小提琴。它仅在将数据粘贴到输入时执行您指定的操作。

http://jsfiddle.net/pTmKc/2/

$(document).ready(function () {
var textval = $('#input');
var youtube = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i;

var pasting = false;

$("#input").bind('paste', function () {
    pasting = true;
});

$("#input").bind('propertychange input', function () {
    if(!pasting) {
        return;
    }
    pasting = false;

    if (youtube.test(textval.val())) {
        var yurl = textval.val().match(youtube)[0];
        alert(yurl);
    }
});

});

于 2013-10-26T17:05:00.687 回答
0

您认为“粘贴”事件的方式有效,但实际上并非如此。粘贴事件仅触发从剪贴板粘贴某些内容。它不提供正在粘贴的数据。当然,您可以从剪贴板访问它,但 Javascript 限制了对剪贴板的访问,您需要以不同的方式处理它。看到这两个线程,你就会明白怎么做

  1. 在 Javascript 中拦截粘贴事件
  2. JavaScript 在粘贴事件中获取剪贴板数据(跨浏览器)

希望能帮助到你。

于 2013-10-26T17:05:30.587 回答