jQuery onay kutusu işaretli durum değişti olay


629

Bir onay kutusu işaretli / işaretli olmadığında bir olayı istemci tarafında tetiklemek istiyorum:

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

Temel olarak, sayfadaki her onay kutusu için olmasını istiyorum. Bu tıklamaya ateş etme ve durumu kontrol etme yöntemi iyi mi?

Daha temiz bir jQuery yolu olması gerektiğini düşünüyorum. Bir çözüm bilen var mı?


Bu soruyu sormak için herhangi bir ihtiyaç yine çok üst .... aynı soruyu stackoverflow var olarak nerede olduğunu stackoverflow.com/questions/901712/...
Ariful İslam'ı

28
@Arif Yinelenen olduklarını sanmıyorum çünkü bağlantılı soru bir onay kutusunun durumunu almakla ilgili, bu bir işaretli olayla ilgili.
Rachel

1
Her zaman bu işaretli özelliği aramak zorunda, bunu burada yazılı olarak
user3199690

Yanıtlar:


1229

changeBunun yerine etkinliğe bağlanın click. Ancak, yine de onay kutusunun işaretli olup olmadığını kontrol etmeniz gerekecektir:

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

changeOlaya olay üzerinden bağlanmanın ana yararı click, bir onay kutusuna yapılan tüm tıklamaların durumun değişmesine neden olmamasıdır. Yalnızca onay kutusunun durumunu değiştirmesine neden olan olayları yakalamak istiyorsanız, uygun şekilde adlandırılmış changeolayı istersiniz . Yorumlarda düzeltildi

Ayrıca this.checked, öğeyi bir jQuery nesnesine sarmak ve jQuery yöntemlerini kullanmak yerine kullandığımı, çünkü doğrudan DOM öğesinin özelliğine doğrudan erişmenin daha kısa ve daha hızlı olduğunu unutmayın.

Düzenle (yorumlara bakın)

Tüm onay kutularını almak için birkaç seçeneğiniz vardır. :checkboxYalancı seçiciyi kullanabilirsiniz :

$(":checkbox")

Veya şuna eşit bir özellik kullanabilirsiniz :

$("input[type='checkbox']")

1
Aslında sınıfın onay kutusunu aradım. Sınıftan bağımsız olarak tüm onay kutularını almanın daha iyi bir yolu var mı?
AnonyMouse

4
@AnonyMouse - Düzenlememi görün. Bunu yapmanın birkaç yolu var.
James Allardice

18
@Vigrond - Aslında, bir etikete tıklamak ilgili kontrolde tıklama olayını tetikler: jsfiddle.net/ZFG84
James Allardice

4
Bu daha temiz $(this).is(':checked'). changeKlavyedeki değişiklikleri (sekme, isabet alanı) tespit etmek istiyorsanız olayı kullanmak zorunda olduğunuzu düşündüm , ancak şaşırtıcı bir şekilde, clickbir fare tıklamasından olmayan değişiklikleri de algılar, jQuery olayı olup olmadığından emin değil, jsfiddle.net E39sz
Juan Mendes

41
Not: Lütfen türlü etkinliğe Bağlama click, changesayfadaki tüm onay kutularına ya da her neyse (onay kutularını miktarına depepending) performans sorunlarına neden olabilir. Üst öğeye veya belgeye bağlanmayı ve kabarmış olayı yakalamayı deneyin. Örneğin$('form').on('change', ':checkbox', function(){ //stuff });
hitautodestruct

109

Gelecekte zorluk çeken herkese başvurmak için, onay kutularını dinamik olarak ekliyorsanız, yukarıdaki kabul edilen doğru cevap çalışmaz. Bir üst düğümün belirli bir torundan gelen kabarmış olayları yakalamasına ve bir geri arama yapmasına izin veren olay temsilcisinden yararlanmanız gerekir .

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

documentÜst seçici için neredeyse her zaman gereksizdir . Bunun yerine, etkinliğin çok fazla düzeyde yayılmasını önlemek için daha spesifik bir üst düğüm seçin.

Aşağıdaki örnek, dinamik olarak eklenen dom düğümlerinin olaylarının önceden tanımlanmış dinleyicileri nasıl tetiklemediğini gösterir.

$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>

Bu örnekte, belirli bir düğüm için ( h1bu durumda) olayları yakalamak ve bu tür olaylar için geri arama yapmak üzere olay yetkisi kullanımı görüntülenir .

$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>


23

Başka bir çözüm

$('.checkbox_class').on('change', function(){ // on change of state
   if(this.checked) // if changed state is "CHECKED"
    {
        // do the magic here
    }
})

4
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
JAL

12

Amacınız yalnızca işaretli onay kutularına etkinlik eklemekse (bu yüzden işaretlenmediklerinde ve daha sonra tekrar kontrol edildiklerinde tetiklenirler) o zaman istediğiniz şey budur.

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

    })
})

niyetiniz tüm onay kutularına etkinlik (işaretli ve işaretsiz) eklemekse

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

    })
})

Eğer sadece işaretlenirken (işaretlenmemişken) ateş etmesini istiyorsanız, yukarıdaki @James Allardice cevabı.

BTW input[type='checkbox']:checked, CSS seçicidir.


Yalnızca işaretlenmemiş onay kutularını bulmak isterseniz ne olur? Ben tüm kontrol $ $ için var ("# tableUSNW tbody tr td [id = td1]: onay kutusu: işaretli"); ama kontrol edilmemiş olanları nasıl bulacağımı bilmiyorum.
FrenkyB

1
@FrenkyB aşağıdakileri deneyin:$("input[type='checkbox']:not(:checked)")
Matas Vaitkevicius

5
$(document).ready(function () {
    $(document).on('change', 'input[Id="chkproperty"]', function (e) {
        alert($(this).val());
    });
});

3

Bir etkinliğe dayalı eylem gerçekleştirme (tıklama etkinliğinde).

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

Mevcut duruma göre işlem yapmadan.

$('#my_div').hide();
if($('#my_checkbox').is(':checked')){
  $('#my_div').show();
}

'click' olayında bu durumda çalışmaz. 'değişim' üzerine çalışır.
Mehmood Memon

2

belki bu sizin için bir alternatif olabilir.

<input name="chkproperty" onchange="($(this).prop('checked') ? $(this).val(true) : $(this).val(false))" type="checkbox" value="true" />`

2

Bu, onay kutusunun işaretli olup olmadığıdır. #Prop () işlevini kullanın //

$("#c_checkbox").on('change', function () {
                    if ($(this).prop('checked')) {
                        // do stuff//
                    }
                });

1

Bu jQuery doğrulamasını deneyin

$(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

Çok basit, bu şekilde kullanıyorum:

JQuery:

$(document).on('change', '[name="nameOfCheckboxes[]"]', function() {
    var checkbox = $(this), // Selected or current checkbox
        value = checkbox.val(); // Value of checkbox

    if (checkbox.is(':checked'))
    {
        console.log('checked');
    }else
    {
        console.log('not checked');
    }
});

Saygılarımızla!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.