我有一个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的原型库。
答案 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可能会占用大量时间!