作为对潜在的无序AJAX呼叫完成的创可贴修复,我的购物车提供商最近将“async:false”卡入购物车计算代码中。这具有防止在非Mozilla浏览器上显示jquery进度对话框的副作用。因此,那些用户坐在那里,没有反应的页面认为某些内容被破坏,而正在计算运费和销售税。
以下是他们告诉我的事情:
“其他浏览器中的Ajax调用会阻止javascript ui事件。 Firefox允许ui对话框显示,即使它已经存在 稍微推迟,ajax开始“
我可以重构他们的代码并链接AJAX调用,但我真的不想对他们的代码进行那么多的手术。
还有其他方法可以让它发挥作用吗?
答案 0 :(得分:0)
将async设置为false肯定会导致此问题。前几天我遇到了同样的问题。拥有动画和同步请求的唯一方法是使用window.setTimeout()
插入暂停。这并不理想,因为它会增加执行的强制性延迟。此外,您可能会看到动画在同步请求运行时停止并启动。
如果你想让代码异步工作,我建议这样:
$("#form").submit( function (event) {
$("#dataToIterateThru").each( function (i, val) {
event.preventDefault();
$.ajax({
url: 'http://mytargeturl.com/?parameter=' + val,
type: 'GET',
dataType: 'html',
context: $("<span>", {id: 'ajax-'+i}).appendTo($("#output")),
success: function (data) {
$(this).replaceWith(data.value);
}
});
});
});
});
如果你没有抓住它,context
属性会为回调函数创建一个占位符,以便稍后引用(使用$(this)
)。您也可以只为context
使用序列号(例如1,2,3,4),并将数据与数字一起发送到“处理”功能。每次调用该函数时,它将按顺序处理它所拥有的数据,在序列号丢失时停止。有趣的是,这与TCP用于无序数据包的方法几乎相同。