2013-09-30 98 views
0

我有一個可選的電話號碼的HTML輸入,用2個無線電輸入(留言,不要留言)沿着:的JavaScript onkeypress事件延遲的觸發

<input type="text" class="input-medium phoneNum2" name="secondaryPhone" id="secondaryPhone" onkeypress="toggleRadio(this)" onblur="toggleRadio(this)" placeholder="703-555-1010" value="<cfoutput>#session.secondaryPhone#</cfoutput>" /> 

通知我已經兩個事件運行(刪除它們中的一個產生同樣的問題,都有幫助,但我寧願只有1個事件,除非必要)。

這裏的場景是:第二個人開始在輸入中輸入內容,它檢查是否已經檢查了其中一個單選按鈕。如果不是,則默認選擇是。如果由於某些原因,他們刪除了電話號碼,因爲他們不想提供它,兩個單選按鈕都應該取消選中(只有onblur在那裏工作)。如果在用戶開始輸入之前選擇了「不要離開消息」,則它不應該默認爲是。

這裏是JavaScript:

function toggleRadio(x) { 
    y = document.getElementById("contactSecondaryYes"); 
    z = document.getElementById("contactSecondaryNo"); 
    if (x.value.length < 1) { 
     y.checked = false; 
     z.checked = false; 
    } 
    if (x.value.length > 0 && !z.checked) y.checked = true; 
} 

現在的問題:當我在2個字符類型的默認選項是時纔會觸發,而不是期望1(?簡直就像在代碼中的延遲) 。如果在開始輸入之前選擇了「否」,則輸入2個字符後,默認爲「是」。同樣,在onkeypress事件期間只有當輸入在onblur事件期間失去焦點時,沒有任何內容被「取消選擇」。

我使用錯誤的事件嗎?是否存在邏輯缺陷?沒有錯誤消息,不,我不能在這裏使用jQuery,所以請不要給我jQuery的答案或通常的「爲什麼不使用jQuery?」 (我愛jQuery我只是有我不能使用它的原因)。

編輯:我也嘗試訂購這樣的JavaScript,無濟於事。

function toggleRadio(x) { 
    y = document.getElementById("contactSecondaryYes"); 
    z = document.getElementById("contactSecondaryNo"); 
    if (x.value.length > 0 && !z.checked) y.checked = true; 
    if (x.value.length < 1) { 
     y.checked = false; 
     z.checked = false; 
    } 
} 

基本上我想知道爲什麼代碼的行爲就像有一個延遲,有沒有辦法解決它?

回答

2

嘗試使用替代的onkeyup:

onkeyup="toggleRadio(this)" 
+0

,似乎工作,你能解釋一下爲什麼嗎?我以爲keypress基本上是「onkeydown + onkeyup」 –

+2

他們被解僱的順序是onkeydown,onkeypress,onkeyup。由於您正在對值進行評估,通過將其移至onkeyup,您可以確保在執行toggleRadio檢查之前字段的值已更改。隨着keydown和按鍵,你在字段被修改之前檢查。此外onkeypress不會被解僱的所有鍵。 – Speedy