jQuery checkbox zaznaczony Stan zmieniony Zdarzenie

Chcę, aby Zdarzenie uruchamiało się po stronie klienta, gdy pole wyboru jest zaznaczone/niezaznaczone:

$('.checkbox').click(function() {
  if ($(this).is(':checked')) {
    // Do stuff
  }
});

Zasadniczo chcę, aby stało się to dla każdego checkboxa na stronie. Czy ta metoda odpalania na kliknięciu i sprawdzania stanu jest ok?

Myślę, że musi być czystszy sposób jQuery. Ktoś zna rozwiązanie?

Author: Seth, 2011-12-08

8 answers

Bind do zdarzenia change zamiast click. Jednak prawdopodobnie nadal będziesz musiał sprawdzić, czy pole wyboru jest zaznaczone, czy nie:

$(".checkbox").change(function() {
    if(this.checked) {
        //Do stuff
    }
});

główną zaletą powiązania ze zdarzeniem change przez zdarzenie click jest to, że nie wszystkie kliknięcia na polu wyboru powodują zmianę stanu. Jeśli chcesz przechwytywać tylko zdarzenia, które powodują zmianę stanu pola wyboru, chcesz mieć Zdarzenie o odpowiedniej nazwie change. ZREDAGOWANO w komentarzach

Zauważ również, że używałem this.checked zamiast owijać element w obiekt jQuery i używać metod jQuery, po prostu dlatego, że dostęp do Właściwości elementu DOM jest krótszy i szybszy.

Edit (Zobacz komentarze)

Aby uzyskać wszystkie pola wyboru, masz kilka opcji. Możesz użyć :checkbox pseudo-selektor:

$(":checkbox")

Lub możesz użyć atrybutu równa się selektor:

$("input[type='checkbox']")
 1029
Author: James Allardice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-21 13:55:38

W przyszłości dla każdego, kto ma trudności, jeśli dodajesz pola dynamiczne, poprawna odpowiedź powyżej nie będzie działać. Musisz wykorzystać delegację zdarzeń , która pozwala węzłowi nadrzędnemu przechwytywać pęcherzykowe zdarzenia z określonego potomka i wysyłać wywołanie zwrotne.

// $(<parent>).on('<event>', '<child>', callback);
$(document).on('change', '.checkbox', function() {
    if(this.checked) {
      // checkbox is checked
    }
});

Zauważ, że prawie zawsze nie ma potrzeby używania document dla selektora nadrzędnego. Zamiast tego wybierz bardziej konkretny węzeł nadrzędny, aby zapobiec rozprzestrzenianiu się zdarzenia zbyt wiele poziomy.

Poniższy przykład pokazuje, jak zdarzenia dynamicznie dodawanych węzłów dom nie wywołują wcześniej zdefiniowanych detektorów.

$postList = $('#post-list');

$postList.find('h1').on('click', onH1Clicked);

function onH1Clicked() {
  alert($(this).text());
}

// simulate added content
var title = 2;

function generateRandomArticle(title) {
  $postList.append('<article class="post"><h1>Title ' + title + '</h1></article>');
}

setTimeout(generateRandomArticle.bind(null, ++title), 1000);
setTimeout(generateRandomArticle.bind(null, ++title), 5000);
setTimeout(generateRandomArticle.bind(null, ++title), 10000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="post-list" class="list post-list">
  <article class="post">
    <h1>Title 1</h1>
  </article>
  <article class="post">
    <h1>Title 2</h1>
  </article>
</section>

Podczas gdy ten przykład wyświetla użycie delegowania zdarzeń do przechwytywania zdarzeń dla określonego węzła (h1 w tym przypadku) i wywołuje wywołanie zwrotne dla takich zdarzeń.

$postList = $('#post-list');

$postList.on('click', 'h1', onH1Clicked);

function onH1Clicked() {
  alert($(this).text());
}

// simulate added content
var title = 2;

function generateRandomArticle(title) {
  $postList.append('<article class="post"><h1>Title ' + title + '</h1></article>');
}

setTimeout(generateRandomArticle.bind(null, ++title), 1000); setTimeout(generateRandomArticle.bind(null, ++title), 5000); setTimeout(generateRandomArticle.bind(null, ++title), 10000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="post-list" class="list post-list">
  <article class="post">
    <h1>Title 1</h1>
  </article>
  <article class="post">
    <h1>Title 2</h1>
  </article>
</section>
 86
Author: applecrusher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-30 12:34:43

Just another solution

$('.checkbox_class').on('change', function(){ // on change of state
   if(this.checked) // if changed state is "CHECKED"
    {
        // do the magic here
    }
})
 20
Author: Siddhartha Chowdhury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 16:42:26

Jeśli twoim zamiarem jest dołączanie zdarzenia Tylko do zaznaczonych checkboxów (więc odpali się, gdy nie zostaną zaznaczone i ponownie zaznaczone), to jest to, czego chcesz.

$(function() {
    $("input[type='checkbox']:checked").change(function() {

    })
})

Jeśli twoim zamiarem jest dołączenie zdarzenia do wszystkich checkboxów (zaznaczonych i niezaznaczonych)

$(function() {
    $("input[type='checkbox']").change(function() {

    })
})

Jeśli chcesz, aby odpalił tylko wtedy, gdy są sprawdzane (z niezaznaczonego), to @ James Allardice odpowiedz powyżej.

BTW input[type='checkbox']:checked to selektor CSS.

 12
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-19 08:41:27
$(document).ready(function () {
    $(document).on('change', 'input[Id="chkproperty"]', function (e) {
        alert($(this).val());
    });
});
 3
Author: Burhan Kaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 12:06:21

Być może to może być alternatywa dla Ciebie.

<input name="chkproperty" onchange="($(this).prop('checked') ? $(this).val(true) : $(this).val(false))" type="checkbox" value="true" />`
 1
Author: caras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-30 18:03:20

Podejmowanie działań w oparciu o Zdarzenie (Zdarzenie kliknięcia).

$('#my_checkbox').on('click',function(){
   $('#my_div').hide();
   if(this.checked){
     $('#my_div').show();
   }
});

Bez podejmowania działań w oparciu o aktualny stan.

$('#my_div').hide();
if($('#my_checkbox').is(':checked')){
  $('#my_div').show();
}
 1
Author: Hasib Kamal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 09:47:21

Try this jQuery validation

$(document).ready(function() {
  $('#myform').validate({ // initialize the plugin
    rules: {
      agree: {
        required: true
      }

    },
    submitHandler: function(form) {
      alert('valid form submitted');
      return false;
    }
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.js"></script>

<form id="myform" action="" method="post">
  <div class="buttons">
    <div class="pull-right">
      <input type="checkbox" name="agree" /><br/>
      <label>I have read and agree to the <a href="https://stackexchange.com/legal/terms-of-service">Terms of services</a> </label>
    </div>
  </div>
  <button type="submit">Agree</button>
</form>
 1
Author: Nishanth ॐ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 06:41:03