Bo-Blog 2.0一個使用習慣導致的問題

這是在Jaciyeh網誌升級到Bo-Blog 2.0 RC3所遇到的問題。

昨天到他的網誌留言評論一篇文章,沒想到卻重複發了好幾篇,重新再試一次,結果還是一樣,反而他自己的評論都很正常,於是向Bob反應這個問題,Bob也很快提出解決方法,如果你使用Bo-Blog 2.0也遇到同樣的情形,可以參考以下解決方法:

今天接到訪客carloschen的報告,稱:「試過在別人網誌留言會重複發文好幾篇」。如果您的blog也遇到了同樣的問題,你可以直接跳到我這篇日誌的結尾看解決方法。假如您有興趣瞭解一下這個問題的成因,那麼請往下看。

這個情況和使用的習慣有關。在評論提交處的結尾,是輸入驗證碼的輸入框。如果填寫完所有信息後,點擊下方的「提交」按鈕提交評論,那是不會出現問題的。評論在經過處理後會馬上反應在頁面上,這是符合預期效果的。但如果用戶也可能有這樣的習慣,那就是在填完所有信息後,如果最後一個輸入框是單行的文本框,那麼直接按鍵盤上的回車鍵就可以提交了。想當初剛剛上網的時候,這個還是老鳥作為一個「技巧」傳授給我的。IE和Firefox均支持這個特性。

不過問題也產生了。當按回車鍵在驗證碼輸入框內直接提交這個評論的時候,瀏覽器沒有執行點擊「提交」按鈕時執行的動作,這樣就越過了Ajax提交這個步驟,直接提交了評論,也就是最平常的「有刷新」的提交方式。這也沒什麼,頂多就是刷新了一次,不如Ajax這麼迅速就能看到評論的效果罷了。但是,由於部分模板在form的onsubmit事件中增加了觸發ajax回復的事件,這樣就導致了提交兩次的問題!首先是在按下enter鍵的一剎那,觸發了onsubmit事件,評論提交了一次,又因為瀏覽器在執行此次事件後繼續了提交動作,因此評論又在無ajax事件的情況下再提交了一次。這就是產生兩個相同評論的原因。(可用IE重現。)

解決起來也容易,那就是去掉form的onsubmit 事件,然後把form的action地址改為與按下提交按鈕的事件相同的javascript就可以了。

解決方法:
在模板的 elements.php 中,查找到

<form name="visitorinput" id="visitorinput" method="post" action="{actionurl}">

做如下修改

<form name="visitorinput" id="visitorinput" method="post" action="javascript: ajax_submit('{jobnow}');">

如果模板的此位置還有這樣的句子:

onsubmit="ajax_submit('{jobnow}');"

把它刪除即可。也就是說,最後這裡應該都是這樣的:

<form name="visitorinput" id="visitorinput" method="post" action="javascript: ajax_submit('{jobnow}');">

修改後,無論是按提交按鈕,還是在驗證碼輸入框內按回車鍵提交,都只會提交一次,而且都會觸發Ajax回復事件。