jQuery прапорець встановив прапорець


628

Я хочу, щоб подія запустила клієнтську сторону, коли прапорець встановлений / знятий:

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

В основному я хочу, щоб це сталося для кожного прапорця на сторінці. Чи цей спосіб стрільби по клацанню та перевірка стану добре?

Я думаю, що повинен бути більш чистий спосіб jQuery. Хтось знає рішення?


чи потрібно задавати це запитання ще раз, де дуже високо проголосований той самий питання є в stackoverflow .... stackoverflow.com/questions/901712/…
Ariful Islam

28
@Arif Я не думаю, що вони дублюють, тому що пов'язане питання стосується стану прапорець, тоді як це про перевірену подію.
Рейчел

1
Мені завжди доводиться шукати цю перевірену власність, є багато способів досягти цього, як написано тут
user3199690

Відповіді:


1228

Прив’язати до changeподії замість click. Однак, ймовірно, вам потрібно буде все-таки перевірити, чи встановлено прапорець:

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

Основна перевага прив’язки до changeподії над clickподією полягає в тому, що не всі клацання прапорець призведе до зміни стану. Якщо ви хочете зафіксувати лише події, які призводять до зміни стану, ви хочете влучно названу changeподію. Перероблений у коментарях

Також зауважте, що я використовував this.checkedзамість загортання елемента в об’єкт jQuery та використовував методи jQuery, просто тому, що коротше та швидше отримати доступ до властивості елемента DOM.

Редагувати (див. Коментарі)

Щоб отримати всі прапорці, у вас є пара варіантів. Ви можете використовувати :checkboxпсевдоселектор:

$(":checkbox")

Або ви можете використовувати атрибут, рівний селектору:

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

1
Насправді у мене це шукає прапорець класом. Чи є кращий спосіб просто отримати всі прапорці незалежно від класу?
AnonymousMouse

4
@AnonymousMouse - Переглянь мою редакцію. Є кілька способів це зробити.
Джеймс Еллардіс

18
@Vigrond - Насправді натискання мітки викликає події натискання на пов'язаному елементі
James Allardice

4
Це набагато чистіше, ніж $(this).is(':checked'). Я думав, що вам доведеться використовувати changeподію, якщо ви хочете виявити зміни з клавіатури (вкладка, натискання на пробіл), але дивно, але clickтакож виявляє зміни, які не є клацанням миші, не впевнений, чи це річ jQuery, jsfiddle.net / mendesjuan / E39sz
Хуан Мендес

41
Будь ласка , зверніть увагу: Binding будь-яка подія click, changeабо що - то для всіх прапорців на сторінці може викликати проблеми з продуктивністю (depepending на суму прапорців). Спробуйте прив’язатись до батьківського елемента або документа та захопити події, що $('form').on('change', ':checkbox', function(){ //stuff });
переносяться,

108

Для подальшого звернення до тих, хто тут має труднощі, якщо ви додаєте прапорці динамічно, правильна прийнята відповідь вище не працюватиме. Вам потрібно буде використовувати делегування подій, яка дозволяє батьківському вузлу фіксувати перенесені події від конкретного нащадка та видавати зворотний виклик.

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

Зауважте, що майже завжди зайве використовувати documentдля вибору батьків. Замість цього виберіть більш конкретний батьківський вузол, щоб запобігти поширенню події на занадто багато рівнів.

Наведений нижче приклад показує, як події динамічно доданих вузлів дому не запускають раніше визначених слухачів.

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

Хоча цей приклад відображає використання делегування подій для зйомки подій для конкретного вузла ( h1у цьому випадку) та видачі зворотного дзвінка для таких подій.

$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

Просто ще одне рішення

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

4
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
JAL

12

Якщо ви маєте намір приєднати подію лише до встановлених прапорців (так що це буде спрацьовувати, коли вони не будуть відмічені та перевірені пізніше), це те, що ви хочете.

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

    })
})

якщо ви маєте намір приєднати подію до всіх прапорців (встановлено прапорець і не поставлено галочку)

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

    })
})

якщо ви хочете, щоб він запускався лише тоді, коли вони перевіряються (з невірно перевірених), тоді відповідь @James Allardice вище.

BTW input[type='checkbox']:checked- це селектор CSS.


Що робити, якщо ви хочете знайти лише невизначені прапорці? У мене є це для всіх зареєстрованих $ ("# tableUSNW tbody tr td [id = td1]: checkbox: галочка"); але я не знаю, як знайти все без перевірки.
FrenkyB

1
@FrenkyB спробуйте наступне:$("input[type='checkbox']:not(:checked)")
Матас Вайткевічус


3

Дія, що базується на події (на події клацання).

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

Без вжиття заходів на основі поточного стану.

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

подія "натиснути" в цьому випадку не працює. на "зміни" працює.
Мехмуд Мемон

2

можливо, це може бути альтернативою для вас.

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

2

Це рішення, щоб знайти, чи прапорець встановлений чи ні. Використовуйте функцію #prop () //

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

1

Спробуйте цю перевірку jQuery

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

Це дуже просто, саме так я використовую:

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');
    }
});

З повагою!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.