【问题标题】:Dynamic Jquery table constructed using ajax response data on textbox's each keyup event, not showing data of last ajax response (last keyup)使用文本框的每个 keyup 事件上的 ajax 响应数据构建的动态 Jquery 表,不显示最后一个 ajax 响应的数据(最后一个 keyup)
【发布时间】:2013-12-31 08:21:55
【问题描述】:

我正在使用 ajax 根据在文本框中输入的内容来获取表格的行数据。

在我的例子中,pincode 输入“1000”获取 10 个位置行,输入“10007”获取一个行。

下面是js代码

 $('#pincode').keyup(function(event){
    var currentElementId = $(this).attr('id');
    enterlocation = document.getElementById(currentElementId).value;
    var len = enterlocation.length;

    if (len != null && len > 2 && event.which != 8) {
    var lastRequestTimeStamp = new Date().getTime();
        $.ajax({
            type : "GET",
            url : "/abc.htm",
            cache : false,
            contentType : "application/json;charset=utf-8",
            dataType : 'json',
            data : {
                searchKey : enterlocation, lastRequestTimeStampSent : lastRequestTimeStamp},
            beforeSend : function() {
                $("#mytable").remove();
            },
            success : function(response) {
            var locations = response;
            var sentTimeStamp = parseInt(lastRequestTimeStamp, 10);
            var recievedTimestamp = parseInt(locations[0].requestTimeStamp, 10);
                $("#mytable").show();
                var locations = response;

                if (currentElementId == "pincode") {
                    $("#div1").append('<table id="mytable"></table>');
                }
                if (currentElementId == "city") {
                    $("#div2").append('<table id="mytable"></table>');
                }
                if (currentElementId == "street") {
                    $("#div3").append('<table id="mytable"></table>');
                }


                if ((sentTimeStamp == recievedTimestamp) && locations != null && locations.length > 0) {
                    $.each(locations, function(index, location) {
                        var locationRow = '<tr id="locationRowId'+index+'">' +
                        '<td>' +    
                        '<input type= "hidden" id ="hSugAddrLine1'+index+'" name ="hSugAddrLine1'+index+'" value="'+replaceNullwithBlank(location.addressLine1)+'">' +
                        '</td></tr>';

                        if ($("#mytable").children().length == 0) {
                            $("#mytable").append(locationRow);
                        } else {
                            $("#mytable").find('tbody:last').append(locationRow);
                        }
                    });
                }
            },
            error : function(jqXHR, textStatus, errorThrown) {
                alert("@Error");
                console.log(textStatus, errorThrown);
            },
            complete : function() {
                $("#mytable").show();
                //$("#mytable").table("refresh");
            }
        });
    }

});

当我在输入框中快速输入 10007 时,我在表格中得到的是大多数情况下 pincode '1000' 的响应数据或某些情况下 pincode '100' 的响应数据。

但是当我在输入文本框中缓慢输入“10007”时,我会在表格中得到正确的 ajax 响应数据,就像输入“10007”一样。

在我看来,呈现缓慢的问题。如前所述,输入“1000”响应数据大于“10007”,所以我认为即使在下一个 ajax 调用响应呈现之后,之前的 ajax 调用更大的数据也会呈现在表上。作为 jquery 和 ajax 的新手和幼稚,我在这里非常头脑风暴。请帮忙!

【问题讨论】:

  • AJAX 调用是异步的。无法保证您首先启动的服务器也会收到服务器的第一个响应。
  • 附注:为什么要删除 beforeSend 中的 $("#mytable")
  • @Barmar 谢谢Barmar。我从来没有真正注意过 AJAX 代表什么。现在我会记住的!
  • @Satpal 因为我想在多个 div 元素中使用单个公用表。用户将与多个 div 元素交互,但每次一个,每个 div 元素都只调用同一个表。我想在我的代码中使用一个 id 表。

标签: jquery ajax


【解决方案1】:

您调用服务器的速度太快了……每次按键操作。这将导致任何类型的大量使用问题。您可能想要做的是在 keyup 事件发生时设置一个计时器,然后在调用计时器时执行 AJAX 调用。将计时器设置为 1 秒,以便在 1 秒内未按下某个键后,进行呼叫。这将减少额外的调用。

此外,将时间戳 id 分配给服务器返回的带有结果的 ajax 调用也没有什么坏处,这样您就可以只使用最后发送的 AJAX 调用来填充结果。

【讨论】:

  • 您很好地了解了这种情况。我将考虑 1 秒的等待时间,以避免用不太有用的请求淹没服务器。我还将找到如何获取服务器时间戳以将它们用作 Id。谢谢你。
  • 不,不...不要获取服务器时间戳。从浏览器发送它并将该时间戳存储为发送的最后一个时间戳......然后将其从服务器返回给浏览器(不变),以便浏览器可以将返回的结果时间戳与预期的最后一个时间戳进行比较,并且只使用与上次发送的调用匹配的结果。
  • 我明白了。我一定会利用它来改进应用程序。感谢大神赐教。
  • 嗨,很抱歉再次打扰,我已经用实现更新了我的代码,但它没有按预期工作。该表仍然显示倒数第二个 ajax 响应的数据,而不是最后一个。
  • 我能够匹配 if 条件中的时间值,但之后表格仍然填充了旧响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2013-06-22
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多