0

我有一个问题,如下所示,我有一个文本框来在执行 keyup 事件后搜索联系人,联系人被附加到一个 div,因为我也使用滚动分页,在 keyup 事件之后该 div 的内容被清理以替换它与新内容一起,但是如果我写得很慢,就会发生这种情况,因为当我写得非常快时,内容不会被替换,而是被附加到现有内容中,因此重复相同的寄存器,可能是因为 ajax 是异步的,之后每个 keyup 它仍然在执行请求。

代码

    var paginam = 1;
    $('div.dvusuarios').scroll(function() {
        if ($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
            paginam++;
            listcontactosmsj($('#txtbuscaamgcon').val(), paginam);
        }
    });

      function listcontactosmsj(contacto, paginam) {
        $.ajax({
            type: 'GET',
            url: "<? echo PUBLIC_PATH . 'message/selcontacts' ?>",
            data: 'contacto=' + contacto
                    + '&pagina=' + paginam
        }).done(function(data) {
            $('div.dvusuarios').append(data);
        });
    }

    listcontactosmsj('', 1);

    $('#txtbuscaamgcon').keyup(function() {
        paginam = 1;
        $('div.dvusuarios').html('');
        listcontactosmsj($(this).val(),paginam );
    });

我试图像这样解决它,但这不起作用

 $('#txtbuscaamgcon').keyup(function() {
            paginam = 1;
            $('div.dvusuarios').html('');
            var refrescar = setInterval(listcontactosmsj($(this).val(),paginam), 5000);
             $.ajaxSetup({cache: false});
        });

我不知道我的源代码有什么问题,mysql 和 php 脚本中的查询都可以。

4

2 回答 2

0

一开始,您应该在 下创建一个新的全局变量paginam,如下所示:

var paginam = 1,
    contactRequest = false;

然后,将您的listcontactosmsj()功能更改为以下内容:

function listcontactosmsj(contacto, paginam) {
    if (contactRequest) {
        contactRequest.abort();
    }
    contactRequest = $.ajax({
        type: 'GET',
        url: "<? echo PUBLIC_PATH . 'message/selcontacts' ?>",
        data: 'contacto=' + contacto
                + '&pagina=' + paginam
    }).done(function(data) {
        $('div.dvusuarios').append(data);
        contactRequest = false;
    });
}

你对正在发生的事情是正确的。当您快速键入时,keyup事件会迅速触发,并且会快速发​​送多个 AJAX 请求。通过此修改,该listcontactosmsj()函数将检查当前是否正在发出请求。如果有,它会取消请求,并开始一个新的请求。

于 2013-11-05T16:25:13.787 回答
0

每次按下一个键时发送一个新的 AJAX 请求并不是显示动态数据列表的方式。

替代方法 1

加载页面时,找到一种合理且相当快速的方法来加载可能与页面相关的所有联系人。在加载初始内容后,在没有任何 AJAX 的情况下过滤用户类型的列表。

替代方法 2

限制执行 AJAX 调用的次数 - 类似于 setTimeout 来检查输入文本是否每 250 毫秒左右更改一次。这可能表现不佳,具体取决于您的服务器响应 AJAX 请求的速度,并且响应时间不能保证在 250 毫秒的阈值内,所以我不会使用这种方法。

于 2016-02-03T18:46:31.180 回答