2009-09-23 8 views
70

Użyłem funkcji hover, gdzie robisz x na mouseover i y i mouseout. Próbuję to samo dla kliknięcia, ale nie wydaje się działać:Kliknij, aby przełączyć z jQuery

$('.offer').click(function(){ 
    $(this).find(':checkbox').attr('checked', true); 
},function(){ 
    $(this).find(':checkbox').attr('checked', false); 
}); 

Chcę pole wyboru, aby być sprawdzana po kliknięciu na div, a niezaznaczone jeśli kliknięciu ponownie - przełącznik kliknięć.

+0

Oto tutorial [Jak stworzyć plugin jQuery do konwersji przyciski radiowe do przycisków kolankowych] (http://sgeek.org/jquery-toggle-button-plugin-for-sliding-toggle-switches-sswitch /) i [Tutaj możesz zobaczyć demo] (http://www.demos.sgeek.org/sswitch-jquery-plugin-demo/). Mam nadzieję, że może ci pomóc lub innym użytkownikom. –

Odpowiedz

213

to łatwo zrobić przez skakaniu prąd „sprawdzone” stan pola wyboru przy każdym kliknięciu. Przykłady:

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.attr('checked', !$checkbox.attr('checked')); 
}); 

czyli

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.attr('checked', !$checkbox.is(':checked')); 
}); 

lub poprzez bezpośrednie manipulowanie DOM 'zaznaczone' właściwości (czyli nie korzystając attr() do sprowadzić aktualny stan klikniętego wyboru):

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.attr('checked', !$checkbox[0].checked); 
}); 

... i tak dalej.

Uwaga: ponieważ jQuery 1.6, pola wyboru, należy ustawić za pomocą prop nie attr:

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.prop('checked', !$checkbox[0].checked); 
}); 
+0

Ooh, twoja droga jest lepsza, przegłosowana. – lod3n

+0

Doskonały, dzięki stosom! – 3zzy

+0

Nie polecam ustawiania atrybutu DOM elementu na wartość boolowską. Prawdopodobnie podczas tego procesu zostanie rzucony na strunę "1". –

0

spróbować zmienić to:

$(this).find(':checkbox').attr('checked', true); 

do tego:

$(this).find(':checkbox').attr('checked', 'checked'); 

Nie 100% pewien, że jeśli to zrobi, ale wydaje mi się przypomnieć mające podobny problem. Powodzenia!

0
$('.offer').click(function(){ 
    if ($(this).find(':checkbox').is(':checked')) 
    { 
     $(this).find(':checkbox').attr('checked', false); 
    }else{ 
     $(this).find(':checkbox').attr('checked', true); 
    } 
}); 
7

Można użyć toggle funkcję:

$('.offer').toggle(function() { 
    $(this).find(':checkbox').attr('checked', true); 
}, function() { 
    $(this).find(':checkbox').attr('checked', false); 
}); 
+0

To jest przestarzałe. –

0
$('.offer').click(function() { 
    $(':checkbox', this).each(function() { 
     this.checked = !this.checked; 
    }); 
}); 
2

Dlaczego nie w jednej linii?

$('.offer').click(function(){ 
    $(this).find(':checkbox').attr('checked', !$(this).find(':checkbox').attr('checked')); 
}); 
27

Innym rozwiązaniem byłoby rozszerzonego jQuery tak:

$.fn.toggleCheckbox = function() { 
    this.attr('checked', !this.attr('checked')); 
} 

Następnie zadzwonić:

$('.offer').find(':checkbox').toggleCheckbox(); 
+2

Podoba mi się to, ponieważ działa również dla pociągów pól wyboru. +1 – Tino

+0

Powinieneś dodać 'this.trigger ('change');' w przeciwnym razie zdarzenie onChange nie zostanie wywołane. –

11

Ostrzeżenie: używanie attr() lub podporę() zmienić stan pola wyboru nie oznacza wystrzelenia z ch ange event w większości przeglądarek, z którymi testowałem. Sprawdzony stan zmieni się, ale nie będzie bąbelkowania zdarzeń. Zdarzenie zmiany należy wywołać ręcznie po ustawieniu sprawdzanego atrybutu. Miałem kilka innych programów do obsługi zdarzeń monitorujących stan pól wyboru i działałyby dobrze z bezpośrednimi kliknięciami użytkowników. Jednak programatyczne ustawianie stanu sprawdzanego nie powoduje konsekwentnego wyzwalania zdarzenia zmiany.

jQuery 1,6

$('.offer').bind('click', function(){ 
    var $checkbox = $(this).find(':checkbox'); 
    $checkbox[0].checked = !$checkbox[0].checked; 
    $checkbox.trigger('change'); //<- Works in IE6 - IE9, Chrome, Firefox 
}); 
+1

można również bezpośrednio wywołać zdarzenie kliknięcia. – davenpcj

1

mam jedną opcję o nazwie chkDueDate i obiekt HTML z zdarzenie click następująco:

$('#chkDueDate').attr('checked', !$('#chkDueDate').is(':checked')); 

Kliknięcie obiektu HTML (w tym przypadku <span>) przełącza zaznaczona właściwość pola wyboru.

0
<label> 
    <input 
     type="checkbox" 
     onclick="$('input[type=checkbox]').attr('checked', $(this).is(':checked'));" 
    /> 
    Check all 
</label> 
0

Najprostszym rozwiązaniem

$('.offer').click(function(){ 
    var cc = $(this).attr('checked') == undefined ? false : true; 
    $(this).find(':checkbox').attr('checked',cc); 
}); 
+0

Zamknij. Będzie "niezdefiniowane" na pierwszym kliknięciu, przypisując wartość "false". Następnie zostanie zdefiniowany na drugim kliknięciu, przypisując wartość "true". Trzecie kliknięcie będzie nadal zdefiniowane, więc nadal będzie przypisane "true". –

0

Kolejne rozwiązanie alternatywne do przełączania wartości pola wyboru:

<div id="parent"> 
    <img src="" class="avatar" /> 
    <input type="checkbox" name="" /> 
</div> 


$("img.avatar").click(function(){ 

    var op = !$(this).parent().find(':checkbox').attr('checked'); 
    $(this).parent().find(':checkbox').attr('checked', op); 

}); 
0
$('controlCheckBox').click(function(){ 
    var temp = $(this).prop('checked'); 
    $('controlledCheckBoxes').prop('checked', temp); 
}); 
1

jQuery: Najlepszy sposób przekazać działania jQuery (jQuery = jQuery).

$("input[type='checkbox']").prop("checked", function(i, val) { 
    return !val; 
});