【问题标题】:JQuery show() is delayed in Internet Explorer/ChromeJQuery show() 在 Internet Explorer/Chrome 中延迟
【发布时间】:2009-08-12 16:30:54
【问题描述】:

在进行 ajax 调用之前,我使用 $('').show() 显示了一个“正在处理...”div 叠加层,并在完成时隐藏。我遇到的问题是,如果我想显示 div,然后在再次隐藏 div 之前进行几次 ajax 调用,它似乎会在 Internet Explorer (7) 和 Chrome (2.0.172.39) 中对事件进行排队,但我在 Firefox (3.0.13) 中获得预期结果。当有一个 ajax 调用时,它工作正常。代码是这样的:

<div id="foo">processing...</div>
<button onclick="performSingle()" />  <-- This behaves like it's supposed to
<button onclick="performMultiple()" /> <-- This queues the events in IE/Chrome.

<script>
$(document).ready(function(){
    $('#foo').hide();
});

function singleAjaxCall() {
    $.ajax({
        url: ...,
        type: "GET",
        async: false, //There is a reason for this.
        success: function() {}
    });
}

function multipleAjaxCalls() {
    singleAjaxCall();
    singleAjaxCall();
    singleAjaxCall();
    singleAjaxCall();
    singleAjaxCall();
    singleAjaxCall();
    singleAjaxCall();
    singleAjaxCall();
}

function performSingle(){
    $('#foo').show();
    singleAjaxCall();
    $('#foo').hide();
}

function performMultiple(){
    $('#foo').show();
    multipleAjaxCalls();
    $('#foo').hide();
}
</script>

【问题讨论】:

    标签: javascript jquery performance internet-explorer


    【解决方案1】:

    也许您应该通过附加到单个 ajax 调用的完整事件来发出信号处理?如果你菊花链你的 ajax 调用,这将迫使它序列化并按照我相信你想要的那样运行。确保最终方法完全隐藏对话框,因为 ajax 调用不会阻塞。

    【讨论】:

      【解决方案2】:

      是的,尝试嵌套您的 Ajax 调用。像这样 -

      function singleAjaxCall() {
          $.ajax({
              url: ...,
              type: "GET",
              async: false, //There is a reason for this.
              success: myCallback1
          });
      }
      
      
      function myCallback1($data)
      {
          if(some condition){
          performSingle();
          }
      }
      

      【讨论】:

        【解决方案3】:

        您可以附加一个函数,以便在节目完成时调用。

        $('#foo').show( 0, function(){multipleAjaxCalls();} )
        

        http://docs.jquery.com/Effects/show

        【讨论】:

        • 如果你已经完成了0,则传递的function 将被忽略。
        【解决方案4】:

        如果 async 设置为 false,则无法成功,原因很好解释 herehere

        当您将 async 设置为 false 时,无论您之前在做什么,浏览器都会冻结。 你应该异步处理你的 ajax 调用,从而调整你的代码(也许你也可以看看this thread)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          • 1970-01-01
          • 2010-10-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多