onComplete for Ajax.Request buggy with cached content

时间:2010-01-24 05:26:58

标签: javascript ruby-on-rails ruby prototypejs

我有一个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的原型库。

1 个答案:

答案 0 :(得分:0)

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

作为一种解决方法,为什么不在创建Ajax请求对象之前使用“Element.show('load_animation_&lt;%= word_obj.word%&gt;')}”?那么你不依赖于onLoading方法和随之而来的“异步”吗?

同样,我总是将“requestHeaders:[”If-Modified-Since“,”Fri,1999年12月31日23:59:59 GMT“]添加到我的ajax请求中,以防止请求被缓存,尤其是缓存ajax请求的IE可能会占用大量时间!