5

我有一个简单的问题(但答案似乎并不简单)。

我的代码中有一个同步 AJAX 调用,我想在这个同步调用之前调用一个函数。

我要调用的函数很简单

$.blockUI();

来自 jQuery BlockUI 插件。

我只是试图把那行放在我的 $.ajax 调用之前,但是 blockUI 似乎是在同步调用之后调用的。

然后我尝试使用 $.ajax 的 beforeSend 选项,问题与上述相同。

提前感谢您提供的任何答案(除了使用异步调用,这在我的情况下是不可能的......)

代码在这里可用:http: //jsfiddle.net/vWsus/2/

4

4 回答 4

4

同步调用很糟糕,它们会锁定浏览器,如果调用没有返回,这不是一个好的用户体验。您遇到的问题是同步调用锁定了浏览器,因此 DOM 永远没有时间重绘。您需要给 DOM 更新时间,因此在进行 Ajax 调用之前设置一个超时。

$.blockUI({ message: '<p>foo</p>' });
window.setTimeout( ajxCallFnc, 100);
于 2012-07-24T14:46:11.363 回答
1

在您的情况下,并不是在同步调用之后调用 blockUI,而只是同步请求阻止了显示回流(这通常比您的实际 DOM 操作“有时晚”发生)。正如您所说,当您在调用 ajax 之前尝试并调用 blockUI 而不是从 beforeSend 回调内部时,您最终会得到几乎相同的结果。

在 jQuery 中没有什么可以阻止这种行为,因为它不是 jQuery 错误(也不是浏览器本身,因为同步 xhr 请求应该无论如何都会冻结浏览器,并且没有任何东西说浏览器必须继续在那种情况下进行回流)。

我只能建议永远不要使用同步请求。异步的很容易处理。

你可以看看Why You Should Use XMLHttpRequest Asynchronously

于 2012-07-24T14:54:27.210 回答
0
this.notifyFixed=function(type,msg,callback){
        this.showNotification(type, msg);
            window.setTimeout(function(){
                if(typeof callback ==="function"){
                    callback();
                }
            },100);
    };

在进行 ajax 调用之前,我有一个想要执行的 notifyFixed 函数,但遇到了同样的问题,所以我添加了超时和一个类似于 epascarello 的回调函数,这对我来说似乎工作正常。

所以希望类似的解决方案可以帮助其他人

于 2014-08-12T18:20:37.320 回答
0

$.blockUI 有一个 onBlock 函数。尝试这样的事情:

$.blockUI({ 
    message: '<img id="processing" src="images/loading.gif" />', 
    onBlock: function() {
        // make your sync call here
        $.ajax({
            type: 'POST',
            cache: false,
            async: false,               
            url: blahblah,
            dataType: 'json'                
        }).done(function(data){
            //process response

        });
    }
}); 
于 2014-02-24T20:58:27.143 回答