【问题标题】:Number of Ajax Requests increases with live jQuery实时 jQuery 增加 Ajax 请求的数量
【发布时间】:2012-06-23 21:32:27
【问题描述】:

我有下面的代码,我使用clone()live()。 代码正在一个带有链接的 jQuery UI 对话框中加载。 每当我单击链接时,它都会转到服务器并用下面的代码填充对话框。 第一次加载页面时它工作正常,但如果我关闭对话框并再次单击链接以获取对话框,正在发送的 Ajax 请求的数量会增加。

第一次发送触发更改我只发送一个请求,我关闭对话框并再次加载它然后触发更改,它同时发送两个 Ajax 请求,第三次同时发送三个请求等等上。

你认为我的问题在哪里?

<input id="TaskId" name="TaskId" type="hidden" value="18" />
<div id="MainDiv">
    <div id="toClone">
        <div style="display: inline;">
            <select id="Tasksess">
                <option value="">لطفاً کار را انتخاب کنيد</option>
                <optgroup label="کار های جديد">
                        <option value="16"style="">q3fe</option>
                        <option value="18"style="">fjhv j</option>
                        <option value="19"style="">wref</option>
                        <option value="25"style="">ff</option>
                </optgroup>
                <optgroup label="کار های در دست اقدام">
                        <option value="13"style="">rr</option>
                        <option value="15"style="">yy</option>
                </optgroup>
                <optgroup label="کار های تمام شده">
                        <option value="14"style="">tt</option>
                        <option value="18"style="">fjhv j</option>
                </optgroup>
            </select>
        </div>
        <div style="display: inline;">
            <select id="Statusess" name="Statusess"><option value="">لطفاً وابستگی را انتخاب کنيد</option>
<option value="1">پيشنياز</option>
<option value="2">همنياز</option>
</select>
        </div>
        <div style="display: none;" id="Ok">
            ok
        </div>
        <div style="display: none;" id="noOk">
            تکراری
        </div>
        <div id="loadingGif" style="display: none;">
            <img src="/Content/Images/ajax-loader/253L.gif" alt=""/>
        </div>
    </div>
</div>
<script type="text/javascript">
    $(document).ready(function () {

        var Maindiv = $("#MainDiv");
        var toClone = $("#toClone");

        //$("#Statusess").each(function () {
            $("#Statusess").live('change', function () {
                if ($(this).find(":selected").val() != "") {                    
                    if ($(this).parent().prev().find(":selected").val() != "") {
                        $(this).parent().parent().find("#loadingGif").attr("style", "display: inline;");
                        $.ajax({
                            url: '/ProjectAdmin/Project/AddTaskDependency?MainTaskId=' + $("#TaskId").val() + '&DependentTaskId=' + $(this).parent().prev().find(":selected").val() + '&Status=' + $(this).find(":selected").val(),
                            type: 'GET',
                            success: function (data, status) {
                                if (data != "0") {
                                    $(this).parent().parent().find("#Ok").attr("style", "display: inline;");
                                    $(this).parent().parent().find("#noOk").attr("style", "display: none;");
                                }
                                else if (data == "0") {
                                    $(this).parent().parent().find("#Ok").attr("style", "display: none;");
                                    $(this).parent().parent().find("#noOk").attr("style", "display: inline;");
                                }
                                var div = $('div:eq(0)', Maindiv).clone();
                                Maindiv.append(div);
                            }
                        });
                        $(this).parent().parent().find("#loadingGif").attr("style", "display: none;");

                    }
                }
            });
        //});

    });
</script>

【问题讨论】:

  • 旁注,不是解决办法:不要使用live(),而是使用on()
  • 我在 Firefox 和 Chrome 中尝试了您的代码(请参阅 jsfiddle.net/PXhdj),但它只为每个 change 事件发出一个 Ajax 请求。也许您还有一些其他代码正在进行 Ajax 调用/导致 change 事件?顺便说一句,要在元素上设置样式,请使用 .css('display', 'inline') 而不是 .attr('style', ...)

标签: ajax jquery-ui-dialog jquery


【解决方案1】:

你应该试试:

$("#Statusess").off('change').on('change', function() {

});

PS:仅适用于 jQuery 1.7+。如果无法升级:

$("#Statusess").die('change').live('change', function() {

});

【讨论】:

  • 如果他们不能升级和使用.on(),他们应该使用.delegate()
  • 我使用 live 是因为我想克隆我的代码并且新代码也响应 change() 但关闭刚刚注入的新代码不会触发更改。我应该怎么办?谢谢
【解决方案2】:

在这种情况下,您不应使用 live,因为每次打开对话框时都会“记住”绑定。如果我正确理解您的问题,您应该使用“点击”而不是“实时”绑定。

【讨论】:

    【解决方案3】:

    您的服务器代码是否也响应底部的 javascript?

    如果是这样,您的问题是每次加载ui对话框时都会执行一次javascript,从而导致额外的绑定,因此每次执行代码时,都会添加额外的请求。

    这种情况下的修复很简单,将 javascript 代码移动到正在加载 ui 对话框的页面。

    【讨论】:

      【解决方案4】:

      如上所述,您应该使用.delegate() 而不是.live()

      要使用delegate,您需要做的就是指定您将在其中收听的父级以及它将对其进行操作的选择器。

      试试这个:

      <script>
      $(function(){
      var Maindiv = $("#MainDiv");
      var toClone = $("#toClone");
      
      $("#MainDiv").delegate('#Statusess','change', function () {
          if ($(this).find(":selected").val() != "") {                    
            if ($(this).parent().prev().find(":selected").val() != "") {
              $(this).parent().parent().find("#loadingGif").attr("style", "display: inline;");
              $.ajax({
                  url: '/echo/html/',
                  type: 'POST',
                  success: function (data, status) {
                      data = "1";
                      if (data != "0") {
                          $(this).parent().parent().find("#Ok").attr("style", "display: inline;");
                          $(this).parent().parent().find("#noOk").attr("style", "display: none;");
                      }
                      else if (data == "0") {
                          $(this).parent().parent().find("#Ok").attr("style", "display: none;");
                          $(this).parent().parent().find("#noOk").attr("style", "display: inline;");
                      }
                      var div = $('div:eq(0)', Maindiv).clone();
                      Maindiv.append(div);
                  }
              });
              $(this).parent().parent().find("#loadingGif").attr("style", "display: none;");
      
          }
        }
      });
      });
      </script>
      

      这里有一个有效的jsfiddle,这里还有一个链接供参考.delegate() 函数。

      【讨论】:

        【解决方案5】:

        要么直接绑定事件处理程序,不使用 live() 或任何其他委托方法,要么将代码移动到外部脚本文件,这样您就不会在每个 ajax 调用上加载相同的代码。使用die() 只是对不需要存在且可以简单解决的问题的创可贴。

        如果将代码留在原处可以简单地使用:

          $("#Statusess").change(function () {...
        

        【讨论】:

          【解决方案6】:

          或许你可以试试:

                  jQuery(function ($) {
          
                      var Maindiv = $("#MainDiv");
                      var toClone = $("#toClone");
          
                          $("#Statusess").on('change', function () {
                              if ($(this).find(":selected").val() != "") {                    
                                  if ($(this).parent().prev().find(":selected").val() != "") {
                                      $(this).parent().parent().find("#loadingGif").css("display", "inline");
                                      $.ajax({
                                          url: '/ProjectAdmin/Project/AddTaskDependency?MainTaskId=' + $("#TaskId").val() + '&DependentTaskId=' + $(this).parent().prev().find(":selected").val() + '&Status=' + $(this).find(":selected").val(),
                                          type: 'GET',
                                          success: function (data, status) {
                                              if (data != 0) {
                                                  $(this).parent().parent().find("#Ok").css("display", "inline");
                                                  $(this).parent().parent().find("#noOk").css("display", "none");
                                              }
                                              else if (data == 0) {
                                                  $(this).parent().parent().find("#Ok").css("display", "none");
                                                  $(this).parent().parent().find("#noOk").css("display", "inline");
                                              }
                                              var div = $('div:eq(0)', Maindiv).clone();
                                              Maindiv.append(div);
                                              div.empty();
                                          }
                                      });
                                      $(this).parent().parent().find("#loadingGif").css("display", "none");
          
                                  }
                              }
                          });
          
          
                  });
          

          【讨论】:

            猜你喜欢
            • 2013-11-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-22
            • 2019-02-12
            相关资源
            最近更新 更多