javascript - Jquery 触发了太多的 ajax 请求

标签 javascript jquery cakephp

我使用 jquery 构建了以下代码。当用户复制并粘贴一个 youtube url 时,我想提取视频 ID 是 jquery 中的 getVideoId(str) 方法。使用 id,我得到视频图像图片标题和内容。

当textbox->("#url") 的长度超过10时,我会发起ajax请求。因此 ajax 请求正在工作。但现在我有另一个问题。当文本框第一次超过 10 个字符时,会触发两个 ajax 请求(使用 firebug 测试)。比当用户输入更多字符时,会触发许多 ajax 请求。

因此这会减慢最后一个 ajax 请求的进程。我只想获取 youtube 链接的数据并显示用户可以在何处添加标题和内容的建议。这就像旧的 facebook 视频视频链接一样。谁有更好的改进代码的建议?

jQuery(document).ready(
    function(){
        $("#url").keyup(function() {
            var $t1 =  $("#url").val();
            var $length = $t1.length;
            var $data;

            $("#title").val($length);
            $("#content").val($t1);

            if($length==0){
                alert('zero value');
                return;
            }

            if($length>10){
                $data = $.ajax({
                url: '<?php echo $this->Html->url(array("action" => "retrieveVideoFeed"));?>',
                dataType: "json",
                data: {
                    vid: getVideoId($t1)
                },
                success: function(data) {
                                            alert('success in getting data');
                }
            });

                return;
            }

        });

            function getVideoId(str) {
                var urlRegex = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
                if (urlRegex.test(str) && str.indexOf('v=') != -1)
                {
                    return str.split('v=')[1].substr(0, 11); // get 11-char youtube video id
                } else if (str.length == 11) {
                    return str;
                }
                return null;
            }
    }
);

最佳答案

您可以缓存调用并使用 blur 事件而不是 keyup:您正在触发大量 AJAX 调用,因为每次按下键时 keyup() 都会触发一个事件,您应该使用 blur 在输入丢失时触发一个事件重点。 如果将调用缓存在对象中,则可以避免大量重复调用

   var cacheUrl = {};

   $("#url").blur(function() {
        var $t1 =  $("#url").val();
        var $length = $t1.length;
        var $data;

        $("#title").val($length);
        $("#content").val($t1);

        if($length==0){
            alert('zero value');
            return;
        }

        if(cacheUrls[$t1] !== undefined && $length>10){
            $data = $.ajax({
            url: '<?php echo $this->Html->url(array("action" => "retrieveVideoFeed"));?>',
            dataType: "json",
            data: {
                vid: getVideoId($t1)
            },
            success: function(data) {
                    //save the data to avoid a future call
                    cacheUrls[$t1] = data;
                                        alert('success in getting data');
            }
        });

            return;
        }elseif ($length>10){
            //you already have the data in  cacheUrls[$t1] 
        }

    });

编辑如果你想使用提交键开始搜索你可以在按下回车键时触发模糊事件,如下所示:

$("#url").keypress(function(e){
    if(e.which == 13){
       $(this).blur();
       return false;
    }
});

关于javascript - Jquery 触发了太多的 ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7874622/

相关文章:

javascript - 删除输入字段内的属性

javascript - 在载有图像的 Canvas 上通过鼠标拖动画一条线

jquery - slideDown Jquery CSS 设置?

javascript - 如何从下拉列表中获取年份并准备日期,然后在引导日期范围中设置开始日期和结束日期

javascript - 在模糊之前选择先前聚焦的输入

php - CakePHP:唯一违规:7 错误:重复键值违反唯一约束

mysql - 在默认数据源中找不到模型的 CakePHP 数据库表

javascript - 我的 Discord 机器人使用 Discord.js 一次发送多条消息

javascript - js排序时保留选中项

html - CakePhp-Bootstrap 提交按钮不会与文本框对齐