2013-05-10 37 views
0

這樣做下面的例子中意味着表單將提交兩次?onsubmit =「submitForm();」之間的區別是什麼?和onsubmit =「return submitForm();」

<form name="myForm" action="demo_form.asp" onsubmit="submitForm();" method="post"> 

function submitForm(){ 
    document.myForm.submit(); 
} 

我有一個錯誤,有時記錄每個記錄的兩個。因爲形式提交

+0

你的例子沒有任何意義,你爲什麼要調用一個函數onsubmit,並在該函數重新提交相同的形式?幸運的是瀏覽器退出或者你會有一個無限循環 – epascarello 2013-05-10 14:00:20

+0

我喜歡你剛剛改變了問題,所以現在標題不符合問題。 – epascarello 2013-05-10 14:01:21

+0

@epascarello所以你可以更好地理解它。 – code511788465541441 2013-05-10 14:02:47

回答

3

的onsubmit =「」的表格元素上定義了一個事件的功能。返回值(如果已定義)將傳回給瀏覽器。虛假值(false,null,undefined等)將阻止瀏覽器繼續進行表單提交。

它類似於其他任何功能

function isValid(form) { 
    if (someBadCondition) { 
    // record some error somewhere 
    return false; 
    } 
    if (someHorribleCondition || someEquallyBadCondition) { 
    // record some other error 
    return false; 
    } 
    return true; 
} 

function canSubmitForm(form) { 
    isValid(form); 
} 

最後一行永遠傳遞返回值回來。因此,

console.log(isValid(someForm)); // true 
console.log(canSubmitForm(someForm)); // undefined 

將onsubmit =「submitForm()」看作您的canSubmitForm。這實際上就是這樣。無論您在onsubmit =「」中定義什麼,都會被視爲一個函數來回答「我們可以提交這個問題嗎?」這個問題。

你會解決上面的例子一樣:

function canSubmitForm(form) { 
    return isValid(form); 
} 

通知return語句將通過現在對canSubmitForm的調用者傳遞的isValid的結果。

因此,

onsubmit="submitForm();" 

onsubmit="return submitForm();" 

差異性之探源的是,在前者,submitForm的返回值被忽略。在後面的例子中,如果submitForm返回一個值,它將被傳遞給onsubmit(它是瀏覽器)的調用者。

您最有可能提交表單兩次,因爲您的代碼表示「提交表單時提交表單」。

如果submitForm JavaScript函數需要擁有提交過程(對於像ajax w/graceful degradation這樣的事情是很常見的),那麼您需要在事件處理函數中添加一個返回false。

onsubmit="submitForm(); return false" 

或改變submitForm返回false,然後的onsubmit它傳遞

onsubmit="return submitForm();" 

function submitForm() { 
    // do some submission stuff 
    return false; 
} 

我推薦前者,你把一個明確的虛假事件處理程序。原因是事件處理程序是需要false的原因。提交併不是虛假的。你沒有失敗或拒絕。 submitForm應該關注提交的東西,並讓你的事件處理程序處理瀏覽器事件處理的東西。再加上它對代碼有一點防錯。

1

兩次return語句返回呼籲提交函數的結果我我懷疑它。如果返回false,它將停止提交表單。

+0

如果您想在實際提交之前進行驗證,那麼這很有價值。 – Oded 2013-05-10 13:59:02

+0

是否意味着我的問題中的示例將提交表單兩次? – code511788465541441 2013-05-10 13:59:09

+0

這取決於submitForm()的作用。但可能是的。它提交兩次嗎? – Brandon 2013-05-10 13:59:56

1

您提交了兩次的原因是,你都運行提交和那麼你submitForm功能。如果你想自定義你的功能邏輯提交,你會想要做的事,如:

的onsubmit =「submitForm();返回false;」

什麼,將要做的就是運行你的提交功能,但阻止提交按鈕的默認行爲。

(請注意,在你上面的例子中,submitForm功能並沒有真正做任何事情,所以整個事情是多餘的,但想必你是在功能規劃更多的邏輯,一旦你解決雙提交問題)

相關問題