判斷表單的按鈕值非常不可靠

如果希望同一個表單可做出不同的submit後的處理,有的時候會希望利用多個不同submit按鈕代表不同的動作開關。我在這一篇文章裡寫到關於submit和button傳出值的比較表:submit及button傳出值比較

不過今天遇到一件事讓我覺得判斷按鈕的值十分的不可靠,尤其是僅依靠submit值是否被傳送的判斷,例如:if($B1)。

今天在處理一個表單的submit事件,原本該事件是寫在<form>標籤裡,運作基本是正常。因為要做一些處理,順便想把這段程式碼(submit事件)給取出來放到其他地方,這樣表單的部份看起來會比較簡潔,所以我就開始移植語法。

在大致上寫好補充的事件處理後,開始進行修改後的測試,惡夢就這麼開始了!原本可以正常submit的表單一直submit不出去。因為想說原來的程式部份是沒有問題的,所以一直沒有去檢查處理submit之後的流程,而把焦點放在js語法上,這樣搞了半天,當心力交瘁之餘,發現Chrome可以正常submit,這讓我十分的訝異,我以為表單莫名的好了,結果再測試Firefox和IE8,還是一樣無法submit。

因為沒辦法繼續在js語法上找碴,所以只能將焦點擺到submit後的php流程,結果發現問題是出在判斷submit按鈕所帶的值是否建立的狀態,也就是if($B1)。一般我們透過submit按鈕將表單submit出去,被按的submit鈕的值會被帶到處理的頁面去。在那之前,如果我們還要透過js來處理表單的submit事件,因為要趕在submit出去之前來得及做判斷,我們必須先將submit事件給取消,所以會下e.preventDefault()。等到判斷完畢之後,我們才會繼續再下this.submit()將表單submit出去,而今天的問題就出在這裡。

先來說明一下結論:

一、單純透過 js觸發submit事件不會建立任何submit按鈕的值,例如透過button的click事件將表單submit。
二、透過submit按鈕提送表單之後,若先將預設事件取消再將表單submit,各家瀏覽器的表現並不一樣。若使用純粹的javascript,Firefox不建立被按的submit鈕的值;IE8、Chrome和safari會建立。若透過jQuery來實作,Firefox、IE8不建立被按的submit鈕的值;Chrome和safari會建立。
三、行內的submit事件處理,因為沒有取消再觸發,所以submit鈕的值都會建立。也就是說,表單會先將事件處理的語法都處理完才會進行submit?
四、行內的submit事件處理,針對表單的元件可以直接以名稱來存取,不需要再下this。而且看起來似乎是會做完事件處理後才將表單submit。

所以如果希望藉由判斷submit的值是否建立才決定要不要處理表單內容,不同的瀏覽器之間是存在相容性問題的,表單很可能一直沒有進行submit後的處理。(無論如何,表單還是可以submit出去的)

最後,檢討一下自己的處理流程。一開始發現表單送不出去(其實有送出去,只是送出後還是在原來的畫面),就應該先從submit後的php流程先檢查,這樣可以很快就發現問題是出在submit的值沒有建立。一開始就執著在js語法上實在是有點莫名其妙。但今天在處理一個簡單的if判斷的時候也出了差錯,顯然今天的狀況十分不佳。

不由得要來感嘆一下:人家說「寶貴的經驗」,經驗為何寶貴?因為往往需要嘔心嚦血才能累積那麼一點點收穫。雖然如此,就自己的角度來講,每每回頭看自己煞費苦心得到的心得,往往又是那麼微不足道。哈,這顆心好像累了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Proudly using Dynamic Headers by Nicasio WordPress Design