2011-06-24 107 views
0

這應該是正確的代碼,但它不工作jQuery的取消選中單選按鈕不工作

<input type="radio" name="test">1 
<input type="radio" name="test">2 

$('input[name=test]').click(function() { 
    $('input[name=test]').attr(‘checked’,false); 
}); 

例如這裏

http://jsfiddle.net/8jKJc/16/

編輯:

我忘了應該說,行如果它的檢查,然後取消選中它

+0

你究竟想要做什麼?根據你的代碼,當你點擊它們時不會檢查任何東西,但如果這是你的目標,那麼你應該添加'disabled'屬性。你能否提供更多關於你最終目標的細節。 – Seth

+0

給這兩個無線電「禁用」屬性不是更容易嗎? (編輯:heh似乎塞思和我有相同的印象;) –

+0

取消選中哪個?您似乎要求點擊選中的元素,清除_both_上的檢查項? – Alnitak

回答

4

更改.attr.prop,它會正常工作。您還需要改變你正在使用周圍的引號「檢查」是正確的類型,因爲這也導致它在一觸即發:

$('input[name=test]').click(function() { 
    $(this).prop('checked',false); 
}); 

你可以看到在這個example fiddle這方面的工作。

更新(基於評論)

現在,我真正瞭解需要什麼,需要不同的方法。你需要記住的checked屬性以前的值,將其存儲在一個屬性:

$('input[name=test]').click(function(e) { 
    var previous = $(this).attr('previous'); 
    if(previous){ 
     $(this).prop('checked', false) 
    } 
    $(this).attr('previous', $(this).prop('checked')); 
}); 

看到這個工作here

更新2(基於進一步的評論)

從第一更新上述代碼不相當的工作,因爲點擊在該組不同的無線電按鈕時,先前檢查無線電遺體previous屬性設置,但收音機實際上沒有被檢查。我們能避免這種情況如下:

var previousElem; 
$('input[name=test]').click(function(e) { 
    var previous = $(this).attr('previous'); 
    if(previous && previousElem === this){ 
     $(this).prop('checked', false); 
    } 
    previousElem = this; 
    $(this).attr('previous', $(this).prop('checked')); 
}); 
+0

的所有討論搞糊塗了,但只有在使用jQuery 1.6+時...... – Alnitak

+0

是的,這是一個很好的觀點。我發佈了這個,因爲這個問題的示例小提琴被設置爲使用1.6。 –

+0

抱歉,我需要它取消選中只有當它檢查 – Lee

0

$('input[name=test]').prop('checked', false);

的jQuery 1.6或更高版本,您可以使用.prop()的值是這樣的:

Fixed jsFiddle

這當然,假設你的目標就是誘使用戶選擇單選按鈕來拒絕他們。

+0

抱歉,我需要它取消選中只有當其選中 – Lee

+0

???這與其他兩種解決方案一樣,沒有檢查任何檢查過的東西。如果你只想修改那些被檢查過的事件(由於事件綁定或某事),你可以使用'$(「input [name = test]:checked」)'。我不太明白你想要發生什麼,否則。 – brymck

1

如果要使用jQuery 1.6+

$('input[name=test]').filter(':checked').prop('checked', false); 

對於早期版本中刪除 '選中' 屬性:

$('input[name=test]').filter(':checked').removeAttr('checked'); 

編輯修復有機磷農藥實際問題,即你如何讓中單擊當前選定的按鈕時,未選中的一組所有單選按鈕,這個工程(在Chrome 12,至少):

$('input[name=test]').click(function(e) { 

    // find out whether it was already checked 
    var wasChecked = $(this).data('checked') || false; 

    // ensure all buttons think they're unchecked 
    $('input[name=test]').data('checked', false); 

    if (wasChecked) { 
     // leave them all unchecked 
     this.checked = false; 
    } else { 
     // just check this one 
     this.checked = true; 
     $(this).data('checked', true); 
    } 
}); 

工作演示在http://jsfiddle.net/alnitak/qHepU/

+0

對不起,我需要它,只有當它的檢查 – Lee

+0

@Lee你原來的代碼沒有提及 - 取消更新,以反映這一點。注意:'.filter(':checked')'優於$(':checked') - 請參閱http://api.jquery。com/checked-selector/ – Alnitak

+0

YEs對不起,我忘了那一點....我只是試過這一行,它不讓我檢查它... – Lee

0

我知道這是一個老的文章,但我有一個更優雅的解決方案:

$('input[type="radio"]').mouseup(function() { 
    if ($(this).prop('checked')) { 
     $(this).one('click', function() { 
      $(this).prop('checked', false); 
     }); 
    } 
}); 

它附加一個mouseup處理程序的單選按鈕。這是因爲顯然單選按鈕的狀態已經在mouseupclick事件之間的某處發生了變化。當你釋放鼠標按鈕時,我們知道單選按鈕的當前狀態。 只有如果它是檢查,我們將一次性click處理程序附加到取消選中它的單選按鈕。

UPDATE:

我做了這個一個jQuery plugin。它還支持單擊標籤並僅捕獲鼠標左鍵單擊。