預設情況下,多重非同步回發以最後發起者為準。若需關鍵操作 (如儲存) 擁有最高優先權,並取消其他進行中回發,可透過 PageRequestManager 客戶端邏輯實現。
Sys.Application.add_load(ApplicationLoadHandler);
function ApplicationLoadHandler(sender, args) {
if (!Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequest);
}
}
var divElem = 'AlertDiv';
var messageElem = 'AlertMessage';
var exclusivePostBackElement = 'Button1'; // 優先權按鈕 ID
var lastPostBackElement;
function InitializeRequest(sender, args) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
// 優先按鈕觸發:中止其他回發
if (prm.get_isInAsyncPostBack() && args.get_postBackElement().id === exclusivePostBackElement) {
if (lastPostBackElement === exclusivePostBackElement) {
args.set_cancel(true);
ActivateAlertDiv('visible', 'A previous postback is still executing. The new postback has been canceled.');
setTimeout("ActivateAlertDiv('hidden','')", 1500);
} else if (lastPostBackElement !== exclusivePostBackElement) {
prm.abortPostBack();
}
}
// 非優先按鈕觸發:若優先回發進行中,取消新回發
else if (prm.get_isInAsyncPostBack() && args.get_postBackElement().id !== exclusivePostBackElement) {
if (lastPostBackElement === exclusivePostBackElement) {
args.set_cancel(true);
ActivateAlertDiv('visible', 'A previous postback is still executing. The new postback has been canceled.');
setTimeout("ActivateAlertDiv('hidden','')", 1500);
}
}
lastPostBackElement = args.get_postBackElement().id;
}
function ActivateAlertDiv(visString, msg) {
var adiv = $get(divElem);
var aspan = $get(messageElem);
adiv.style.visibility = visString;
aspan.innerHTML = msg;
}
if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();
exclusivePostBackElement:指定擁有優先權的控制項 ID。lastPostBackElement:記錄上一次發起回發的控制項。abortPostBack)。set_cancel(true)) 並提示。透過客戶端攔截 initializeRequest 事件,結合狀態追蹤,可實現細粒度的非同步回發優先權控制。