ASP.NET WebForms 自動生成的客戶端腳本,負責處理 `
function _doPostBack(eventTarget, eventArgument) {
// 1. theForm = document.forms[0] (頁面唯一 form)
// 2. onsubmit = theForm.onsubmit (取得 onsubmit 事件處理器引用)
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
// 3. !theForm.onsubmit → 沒有綁定 onsubmit 事件
// 4. theForm.onsubmit() → **呼叫** onsubmit 處理器,取得返回值
// 5. != false → 返回值不為 false (true/undefined/null 都繼續)
theForm._EVENTTARGET.value = eventTarget;
theForm._EVENTARGUMENT.value = eventArgument;
theForm.submit(); // 真正提交表單
}
}
| 寫法 | 含義 | 類型 | 範例 |
|---|---|---|---|
theForm.onsubmit | 取得事件處理器**引用** (函數物件) | Function / null | `function() { return validate(); }` |
theForm.onsubmit() | **呼叫** 事件處理器,取得**返回值** | Boolean / undefined | `true` / `false` / `undefined` |
<form id="form1" runat="server" onsubmit="return validateForm();">
<asp:Button Text="提交" />
</form>
<script>
function validateForm() {
if ($('#txtName').val() === '') {
alert('姓名必填');
return false; // 阻止提交
}
return true; // 允許提交
}
</script>
使用者點擊 Button
↓
__doPostBack('btnSubmit', '')
↓
檢查 theForm.onsubmit 存在嗎? → 否 → 直接 submit()
↓ 是
呼叫 theForm.onsubmit() → validateForm()
↓
返回 false? → 是 → 阻止提交,結束
↓ 否
設置 __EVENTTARGET / __EVENTARGUMENT
↓
theForm.submit() → 瀏覽器原生提交 → 頁面 PostBack
document.getElementById('form1').addEventListener('submit', function(e) {
if (!validateForm()) {
e.preventDefault(); // 阻止提交
return false;
}
// 允許提交,ASP.NET _doPostBack 繼續執行
});
onsubmit (無括號) = **取得函數引用**,用於判斷是否存在onsubmit() (有括號) = **執行函數**,用於取得驗證結果