我想在进行服务器端调用时阻塞UI交互的div,并在程序流返回到客户端时解除阻塞。
如果我不包含unblock语句,它从服务器端进程返回后会进入阻塞状态。似乎一旦点击功能结束,UI阻塞就会激活。因此,当我在同一个函数中同时发出block和unblock语句时,它会忽略阻塞。如果是这样的话?那么我怎样才能得到我想要的结果呢?(例如,在调用某个进程之前阻塞屏幕/元素,并在流返回时解除阻塞)
下面是我的示例代码:$("#button").click(function () {
//$("#sidebar").block({
// message: '<h1>1Processing</h1>',
// css: { border: '3px solid #a00' }
//});
$.blockUI({
message: '<h1>2Processing</h1>',
css: { border: '3px solid #a00' }
});
var result = DoSomeServerSideProcessing();
//$("#sidebar").unblock();
$.unblockUI();
});
附加信息:
DoSomeServerSideProcessing() uses XmlHttpRequest()
访问服务器端。我不希望更改为jQuery ajax调用,因为它是经过测试和成熟的代码块,并且正在从代码的各个点被重用。
示例代码:
function DoSomeServerSideProcessing()
{
var dllUrl=" ... "
var result = httpGet(dllUrl);
}
function httpGet(theUrl) {
var xmlHttp = null;
xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', theUrl, false);
xmlHttp.setRequestHeader('Content-Type', 'text/xml');
xmlHttp.send(null);
var strHtml = xmlHttp.responseText;
xmlHttp = null;
return strHtml;
}
更新:
我尝试转换XmlHttpRequest()到$.ajax()。但它并没有阻塞UI。下列代码:
//$.blockUI();
//alert("before ajax call")
$.ajax({
url: theUrl,
type: "GET",
dataType: "text",
async: false,
beforeSend: function () {
$.blockUI();
},
complete: function () {
$.unblockUI();
},
success: function (result) {
strHtml = result;
//$.unblockUI();
}
});
//alert("after ajax call")
假设
DoSomeServerSideProcessing()
是一个带有回调的AJAX调用,.blockUI和.unblockUI函数已经在其他地方定义了,我将这样做:
function DoSomeServerSideProcessing(url,callback){
$.post(url,function(data){
$.unblockUI();
callback(data);
})
}
$("#button").click(function () {
$.blockUI({
message: '<h1>2Processing</h1>',
css: { border: '3px solid #a00' }
});
var result = DoSomeServerSideProcessing(url,function(data){
});
});
因为您希望在数据返回后调用UnblockUI函数
你需要把unBlock方法放在DoSomeServerSideProcessing
ajax调用的成功回调中。
AJAX是异步的,所以当它与服务器交换数据时,其余的代码将运行