很多時候我們都需要防止重複提交,這方面的文章也比較多,實現的途徑差別也很大.以下是我寫的一種控制提交的方式.因為有些時候即使伺服器能夠識別重複的提交,也會造成問題.比如需要很長等待時間的操作,在首次提交後,不斷重複提交,頁面可能會死掉.用指令碼來控制的話可以防止這種問題.當然也可以指令碼和伺服器都進行控制,這樣就比較完美了.
閑話少說,將以下指令碼放置於頁面頂部.
1document.IsPosted = false;
2function CancelDubSubmit()
3{
4 if ((typeof(event.returnValue) == "undefined" || event.returnValue== true) && !document.IsPosted)
5 {
6 document.IsPosted = true;
7 event.returnValue = true;
8 }
9 else
10 {
11 event.returnValue = false;
12 }
13}
以下加粗部分放置於form標籤中,如果你已經有了onsubmit事件的其他執行函數,可以放在一起,最好將CancelDubSubmit()函數放在最後.<form id="Form1" onsubmit="CancelDubSubmit();" method="post" runat="server">
其中document.IsPosted是為了記錄是否回送.一旦頁面回送,document.IsPosted將為true. 重新載入後,document.IsPosted=false將被執行.當onsubmit事件沒有其他執行函數或者其他執行函數返回true並且document.IsPosted=false時,回送頁面,否則停止回送.
以上方法不能控制使用 function __doPostBack() 函數的伺服器端控制項.因為在此函數中的提交是靠 document.Form1.submit() 實現的,它不會觸發Onsubmit事件.那麼我們還需要重寫__doPostBack() 函數.function __doPostBack(eventTarget, eventArgument) {
if (!document.IsPosted)
{
var theform;
if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
theform = document.forms["Form1"];
}
else {
theform = document.Form1;
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
document.IsPosted = true;
theform.submit();
}
}
請將以上代碼放置於頁面的原__doPostBack() 函數之後.