在(同步)Ajax期间停止浏览器锁定?
我想要做的是将一个加载图像附加到div(所以用户知道正在加载的东西)然后我调用一个jquery ajax函数,它被设置为“async:false”。 这是我的代码:
$jQuery("#playersListDiv").html(loadingImage); $jQuery.ajax({ type: "POST", /* this goesn't work with GET */ url: urlValue, /*ex: "NBAgetGamesList.php" */ data: parameters, /*ex: "param1=hello" */ cache: false, async: false, success: function(data){ } });
问题是浏览器锁定并且不会附加加载图像,直到完成ajax调用之后,这当然是无用的。 Firefox是唯一实际附加加载图像的浏览器。 IE,Chrome和Safari不要附加加载图片。
我知道浏览器锁定发生是因为async设置为false但这是我唯一的选择,因为我必须等待此请求完成才能继续,因为我需要返回的数据。
有没有办法解决? 如果我在添加有效的加载图像之后发出警报,但我不想每次都弹出警报。
尽管你的断言恰恰相反,但你并不需要它是同步的。 无论您需要做什么/在响应之后都可以在成功(和/或错误或完成)回调中完成。 所以改变:
$jQuery("#playersListDiv").html(loadingImage); $jQuery.ajax({ ... async: false, ... }); // OTHER CODE
是这样的:
$jQuery("#playersListDiv").html(loadingImage); $jQuery.ajax({ ... async: true, success: function(data) { // OTHER CODE } });
或者将“OTHER CODE”移动到您从成功回调中调用的单独函数。
如果您需要比这更复杂的东西,您可以将上述内容封装在函数中并将回调传递给它:
function doAjaxStuff(callback) { $jQuery("#playersListDiv").html(loadingImage); $jQuery.ajax({ ... async: true, success: function(data) { // optional other processing here, then: callback(data); } }); } // then from somewhere else in your code: doAjaxStuff(function(data) { // do something with data });
你想要的是jQuery.Deferred() 。
我遇到了这个问题,我找到了解决方案。
假设! 你真的需要在你的ajax request
使用async : false
,并且你想在执行ajax
请求时显示加载的图像。 但是由于async : false
ajax
请求正在停止其他UI操作(显示加载图像)。 因此,对它的简单解决方案,使用fadeIn显示加载图像和fadeOut来隐藏加载图像。
这是一个jsFiddle演示,其中包含一个带有async : false
的ajax
请求。 因此,加载图像不显示。 (我使用show方法显示加载图像。)。
这是另一个带有fadeIn和fadeOut效果的jsFiddle。 它在ajax
请求中显示加载图像而不管async : false
。