2013-10-17 140 views
0

由@Grundy解決,溶液在交通過動態地改變屬性

的底部選擇元件I與其中元件被編程且無需用戶直接點擊單選元件上選擇的無線電選擇的形式。

var $elem = $("input[name=type][value^=foo_]"); // Select the element with name "type" where the value starts with "foo_" (assume only one value is ever found) 
if ($elem.length > 0) // If element is found then toggle the checked value of the radio value 
{ 
    $("input[name=type][checked=checked]").attr("checked", false); // Uncheck all existing checked items 
    $elem.attr("checked", true); // Check the found element from before 
} 

這樣做,我可以看到Chrome的開發人員工具中的屬性更改。上一個選中的輸入未選中,相應的項目將被檢查。這種方法每次都會專門工作多次(我會解釋爲什麼後面會涉及到)。

接下來,我隱藏所有未經檢查的單選按鈕並僅顯示已選中的單選按鈕。

$("input[name=type] + label").hide(); 
$("input[name=type]:checked + label").show(); 

這是第一次選擇輸入。所有未經檢查的輸入將被隱藏,並且選中的輸入將被隱藏。如果第二次選擇了輸入(或者再次選擇了輸入或者之後選擇了其他選項),則隱藏所有輸入,包括已選中的輸入。

如果我檢查$("input[name=type]:checked + label")的匹配元素的數量,它將第一次返回1,第二次返回0這意味着它僅在第二次後纔會被選中。我覺得這是因爲checked屬性在那個時候動態地改變了,但這可能不是問題的原因。

編輯 - 這裏有一個小提琴 fiddle點擊灰色框時通過對值用戶點擊改變會告訴你它的正常行爲。每個值都可以按任意順序多次選擇,但如果您單擊底部的文本(它們看起來不好看),它將以編程方式更改窗體。它只是第一次工作,它似乎並不在乎它是否是用戶以前選擇的。

解決方案 - 信用@Grundy 因爲我知道$elem對象,我發現前面是正在改變我可以引用它,而不是直接試圖尋找與checked屬性的元素的對象。所以我用這個:

var $elem = $("input[name=type][value^=foo_]"); // Created before all the changes 
$elem.next("label").show(); // Referenced after all the changes 

而不是使用這個的:嘗試使用,而不是

$("input[name=type]:checked + label").show(); // Referenced after all the changes 
+0

我不確定您可以在元素隱藏時更改複選框的狀態。 – sdespont

+0

請提供[小提琴](http://jsfiddle.net/).. – super

+0

@sdespont Chrome的開發人員工具即使在隱藏元素時也會顯示屬性更改。問題似乎是通過'checked'屬性選擇該元素。 – JoeyParis

回答

1

$elem.next("label").show(); 

$("input[name=type]:checked + label").show(); 

因爲$elem被選中的複選框,你發現

+0

就在那裏,http://jsfiddle.net/YFdPa/2/ – Shadow

+0

仍然不知道爲什麼我的方式不工作,但你的方式和解決我的問題,所以感謝您的建議!標明你的答案是正確的。 – JoeyParis