2013-04-05 65 views
8

我使用CSS再整一個像這樣的單選按鈕組:爲什麼JQuery會將內聯樣式添加到我的html中?

Restyles radio group

它被隱藏嵌套的標籤,標籤內的實際輸入(按鈕),然後輸入自己設置爲display:none完成在CSS和樣式的標籤本身成爲按鈕,因爲這樣的:

<label for="likert1" class="likert"> 
    <input type="radio" id="likert1" name="patientViewGroup" value="1"> 
    1 
</label> 

這是可以做到所有的CSS ...但由於一些瀏覽器(我在看你,IE8及以下)不承認:checked僞類,這樣做的男人,喲你的實際輸入 - 這是什麼將價值從表格中傳遞出來 - 並不總是註冊它被檢查,所以JQuery來救援。

當我點擊一個標籤時,我現在使用JQuery來設置addClass「.amClicked」,此時它還將收音機的「checked」屬性切換爲「true」,並從中刪除「amChecked」類兄弟姐妹。很簡單,對吧?下面是jQuery代碼:

$('.likert').on("click",function() { 
    console.log("clikcy!"); 
    if(!$(this).hasClass('amChecked')) { 
     $(this).addClass("amChecked"); 
     $(this).children(":radio").attr("checked",true).css("display","none"); 
    } 
    $(this).siblings().removeClass("amChecked") 
         .children(":radio").css("display","none"); 
}); 

嗯,這將是,除了JQuery的,由於某種原因,似乎一心要加入在線「風格」的標籤,以我的<input>是壓倒一切的我display: none;和未隱藏單選按鈕本身,如下面#3:

After a click - the button appears!

及這裏的輸入代碼如下所示點擊後:

<input type="radio" id="likert3" name="patientViewGroup" value="3" 
     checked="checked" style="display: inline-block; " class="amChecked"> 

更糟糕的是,在我的點擊代碼中添加.css("display","none")(如上所示)並未覆蓋它 - 該按鈕仍然顯示。如果我不把它添加到removeClass線,該按鈕就停在那兒,不加制止,像這樣:

enter image description here

SO - 誰能告訴我,爲什麼jQuery是添加此,不速之客,我的代碼,並且我有什麼可以阻止或覆蓋它的嗎?任何幫助將不勝感激!

+1

你可以創建一個jsFiddle的例子嗎? – j08691 2013-04-05 13:53:29

+0

您正在添加'.amChecked'而不是'.amClicked' – kidwon 2013-04-05 13:54:27

+2

您不應該使用'display:none'來隱藏單選按鈕。使用'position:absolute;左:-10000px;'而是。 IE不會對單選按鈕或複選框上的「點擊」事件進行處理,這些事件通過'display:none'或'visibility:hidden'顯式隱藏。 – Pointy 2013-04-05 13:56:43

回答

2

從我的經驗來看,jQuery總是會推送樣式內聯。它影響元素,而不是頁面或樣式表定義的樣式。它只知道元素存在,因爲您指向了該元素。

此外,我不會把收音機內的標籤。這可能是導致問題的原因。

在樣式表或者其它任何你的風格定義爲:

.hidden { 
    display: none; 
} 

爲什麼不使用一類具有display:none;而不是.css().addClass('hidden')。,.removeClass('hidden')應該工作。

然後你就可以使用它。

打算在平均時間內建一個小提琴來測試。

編輯這裏是一個fiddle. 其實,剛開始看着你的jQuery。我不確定我看到預期的結果是什麼?你只是想點擊一個元素,它會改變收音機,對吧?

使用單選按鈕,您不必設置某些內容以使它們不被選中,它們將自行取消選擇。

如果您設置了隱藏值而不是display: none;無線電值,那麼您不會遇到問題評論中提到的問題。然後,您只需設置一個函數,根據您單擊的元素的某個屬性更改隱藏值的值。

+0

好點...沒有給我我完整的答案,但一個很好的電話! – Mattynabib 2013-04-05 14:42:07

+0

看我的小提琴更新。此外,完整的答案是jQuery始終推送'.css()'內聯。 – Plummer 2013-04-05 14:52:52

+0

直接單擊單選按鈕(或其父標籤)將清除組中其他無線電單元的已檢查狀態。但是,以編程方式設置收音機的「已檢查」狀態不會影響組中的其他人。據我們從OP的代碼中知道,點擊事件**將**從標籤傳播到其子輸入。在其他情況下,冒泡可能會停止,或者點擊目標可能不包含受到影響的無線電。 [看看這個小提琴](http://jsfiddle.net/ZVHwG/2/),它省略了其他收音機選項上的'.removeAttr('checked')'。 – 2013-04-05 19:26:53

2

使用CSS設置無線電輸入'display,並且不要用jQuery來改變它。

label.likert > input { 
    display: none; 
} 

此外,要切換「checked」屬性,請爲其指定一個「checked」值。要「取消選中」,您可以刪除該屬性。

$('label.likert').on('click', function() { 
    if (!$(this).hasClass('amChecked')) { 
     $(this).addClass('amChecked').children(':radio').attr('checked', 'checked'); 
    } 

    $(this).siblings('.amChecked').removeClass('amChecked').children(':radio').removeAttr('checked'); 
}); 

我把它一起扔在this fiddle

+0

謝謝,羅德尼,但即使在JSFiddle中,它在選中時也不會隱藏實際的單選按鈕 - 我試圖始終隱藏它們,只顯示樣式標籤。感謝您指出我的unchained JQuery語句,但是 - 我忘了收緊它。 – Mattynabib 2013-04-05 14:48:04

+0

如果您希望它們始終處於隱藏狀態,請勿將它們嵌入標籤中。 '

+0

我的答案和小提琴現在保持隱藏。 – 2013-04-05 18:23:22

相關問題