【问题标题】:onComplete for Ajax.Request buggy with cached content带有缓存内容的 Ajax.Request 错误的 onComplete
【发布时间】:2010-01-24 05:26:58
【问题描述】:

我有一个 Ajax.Request,我在其中使用 onLoading 和 onComplete 来显示和隐藏加载动画 gif。问题是每 10 次左右的点击,即使 ajax 请求成功返回,加载动画也无法隐藏并且只是停留在那里动画。我有许多 div 元素,每个元素都有自己的加载动画和带有 Ajax.Request 的 onclick,如下所示:

    <div id="word_block_<%= word_obj.word %>" class="word_block" >
    <%= image_tag("ajax-loader_word_block.gif", :id => "load_animation_#{word_obj.word}",
                    :style => 'display:none') %>
    <a href="#" onclick="new Ajax.Request('/test/ajax_load', 
     {asynchronous:true, evalScripts:true, 
      onLoading:function() {
        Element.show('load_animation_<%= word_obj.word %>')},
      onComplete:function(){
        Element.hide('load_animation_<%= word_obj.word %>')}}); 
        return false;">Click Here</a>  
    </div>

这看起来有什么问题吗?也许我应该尝试删除内联 onclick 并使用 javascript 以编程方式添加 onclick?我真的不知道为什么会这样。我正在使用带有 ruby​​ on rails 的原型库。

【问题讨论】:

  • 您可能已经检查过了,但以防万一:您确定word_obj.word 的所有值都是唯一的吗?如果您有任何重复,那么您不能依靠 Element.showElement.hide 来显示/隐藏预期的图像,而是它们可能会显示/隐藏页面上的其他图像。

标签: javascript ruby-on-rails ruby prototypejs


【解决方案1】:

我发现 onLoading 属性也很不稳定...假设您的查询已经缓存并且几乎立即返回到您的前端代码。现在让我们说,由于某种原因,执行 onLoading 方法比 onComplete 方法花费的时间更长。最后,让我们疯狂地假设 ajax 是异步的,并且它不会在启动 onComplete 之前等待 onLoading 方法完成。然后你就有了问题的原因!总结一下: - 发送请求 - onLoading 方法被触发但由于某种原因尚未启动 - 请求几乎立即返回 - onComplete 方法被触发并立即开始 => 你最终会在 onLoading 开始之前完成 onComplete 方法:你的元素将隐藏然后显示!

作为一种解决方法,为什么不在创建 Ajax 请求对象之前使用“Element.show('load_animation_')}”?所以你不依赖 onLoading 方法和随之而来的“异步”?

同样,我总是在我的 ajax 请求中添加 "requestHeaders: [ "If-Modified-Since", "Fri, 31 Dec 1999 23:59:59 GMT" ]" 以防止请求被缓存,尤其是在缓存的 ajax 请求会在 IE 中搞砸!

【讨论】:

  • 酷,这是一个很好的线索。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2013-01-06
  • 1970-01-01
  • 2012-06-02
  • 2012-02-12
  • 2013-11-17
相关资源
最近更新 更多