2012-09-24 128 views
1

Example on JS FIddle爲什麼單選按鈕單擊事件的行爲不同

的問題是:

如果首次點擊是單選按鈕,就可以正常工作;但是,如果第一次點擊是跨文本(即aaaa),它不能得到檢查的收音機。

請告訴我爲什麼以及如何讓它變得一樣。

+1

請在您的問題中加入相關代碼! – ThiefMaster

+0

好了,問題應該是如下:鑑於第一無線電被選中,爲什麼點擊跨度文本「BBBB」的行爲不是直接點擊第二個單選輸入 – yejinxin

回答

2

此代碼,當點擊單選按鈕時恰好:

var obj = $(e.target||e.srcElement).parent(); 
score = obj.find('input:checked').val(); 

提出母體在obj變量,它是將含DIV。這包含兩個單選按鈕。然後它會在該DIV中找到FIRST檢查的輸入元素,它在檢查後始終是具有「第一個」值的元素。

你應該只得到它被點擊了該項目的價值:

score = $(e.target||e.srcElement).val(); 

這可以被改寫爲

score = $(this).val(); 

這裏有一個工作示例:http://jsfiddle.net/RPSwD/10/

+0

不知道爲什麼這已經downvoted或者不同 – billyonecan

+0

你的回答不工作。但是可以告訴我爲什麼當我們點擊跨度文字,「obj.find(‘輸入:檢查’)」無法找到正確的檢查收音機,而當我們在電臺直接點擊,它並找到正確的檢查收音機。謝謝。 – yejinxin

+2

單擊span文本時,jQuery在實際檢查它之前調用.click函數。當你直接點擊單選按鈕時,單擊它的動作會檢查它,然後.click功能被觸發。我不確定這是爲什麼,但這是jQuery如何做到的。單選按鈕';當你點擊跨度,如果要觸發功能,您可以使用此代碼'.attr的。點擊功能之前編程方式檢查的單選按鈕(「檢查」,「檢查」)。 – Timm

1

見新fiddle

的問題是這一行:

score = obj.find('input:checked').val(); 

將其更改爲:

score = $(this).val(); 

這樣做的原因是,你正在尋找在div所選擇的項目,但是,從第一次點擊該項目尚未被選中。鑑於該事件針對的是單選按鈕,您可以假設無線電是選定的。請注意,您不需要使用e.target||e.srcElement。 jQuery爲你處理這件事。改爲使用$(this)

此外,您需要在單選按鈕上設置一個名稱,以阻止它們被選中。或者,如果兩者都選擇了所需的行爲,請改用複選框。

+0

你指的是單選項沒有被選中時,我們首先點擊跨度文本,對不對?但爲什麼直接點擊單選按鈕時會有所不同? – yejinxin

+0

@yejinxin是的。事件完成後纔會選中收音機。 –

+1

請你解釋爲什麼會發生這種差異。我是JS的新手。 – yejinxin

-1

只是包裝標籤,標籤內的單選按鈕,這樣

<label for="radio1"> 
    <input type=radio class="x" id="radio1" value="First"/> 
    <span class="y">aaaa</span> 
</label> 

無需額外的jQuery或JavaScript

檢查demo這裏

+0

雖然這有效,但它實際上正在改變JS的語義。不是一個好的解決方案 –

+0

@flem我想過放棄一個更好的解決方案又是什麼OP目前有 – Sibu

+0

我不認爲這是一個更好的解決方案。 JS壞了,需要修復。你的解決方案解決了這個問題,但破碎的JS仍然存在。 –

0

你不需要使用任何event物業:

var score = $(this).val(); // in your '.x' click handler 

$('.y').click(function(e) { 
    $(this).prev('.x').click(); 
}); 
+1

爲什麼downvote? – billyonecan

+0

@deifwud。你沒有解釋爲什麼/你的代碼如何解決這個問題。 –