Флажок «Выбрать все» не работает, так как он должен работать

Я пытаюсь реализовать флажок «Выбрать все», и он работает нормально, единственная проблема заключается в том, что когда я снимаю флажки, функция «Выбрать все» перестает работать для этого конкретного флажка.

Обратите внимание, что я использую фреймворк Laravel, поэтому не реагируйте на php-код.

$(document).ready(function() {
  $("#BulkSelect").click(function() {
    $('.Bulkers').attr('checked', this.checked);
  });

  $('.Bulkers').change(function() {
    if ($(".Bulkers").length == $(".Bulkers:checked").length) {
      $("#BulkSelect").attr("checked", "checked");
    } else {
      $("#BulkSelect").removeAttr("checked");
    }
  });
});
<table id="data-table" class="table table-striped table-bordered table-hover">
  <thead>
   <tr>
      <th><input type="checkbox" id="BulkSelect"></th>
      <th>Hater's Name</th>
      <th>Hater's Profile Link</th>
      <th>Victim's Name</th>
      <th>Victim's Post Link</th>
      <th>Country</th>
      <th>Source</th>
      <th>
        <div class="btn-group" role="group">
          <button id="btnGroupDrop3" type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            Action
          </button>
          <div class="dropdown-menu" aria-labelledby="btnGroupDrop3" x-placement="bottom-start">
            <form method="post" id="BulkDelete" action="{{my_route}}">
              @csrf
              <button type="submit" class="dropdown-item">Delete</button>
              <button type="button" onclick="BulkApprove()" class="dropdown-item">Approve</button>
            </form>
          </div>
        </div>
      </th>
    </tr>
  </thead>
  <tbody>
    @php($i = 0) @foreach($tables as $table)
      <tr class="gradeX">
        <td><input type="checkbox" name="ids[]" form="BulkDelete" class="Bulkers" value="{{$table->id}}"></td>
        <td>{{$table->column_name}}</td>
        <td>{{$table->column_name}}</td>
        <td>{{$table->column_name}}</td>
        <td>{{$table->column_name}}</td>
        <td>{{$table->column_name}}</td>
        <td>{{$table->column_name}}</td>
        <td>
          <div class="btn-group" role="group">
            <button id="btnGroupDrop3" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              Action
            </button>
          </div>
        </td>
      </tr>
    @endforeach
  </tbody>
</table>

person Maaz Khan    schedule 21.11.2019    source источник
comment
Какую версию jQuery вы используете?   -  person PeterKA    schedule 21.11.2019
comment
Другой возможный способ сделать это - дать вашему флажку selectAll атрибут данных, который изменяется, когда флажок установлен и снят, и вы можете сделать некоторый оператор if-else на основе атрибута данных для флажка foreach.   -  person King11    schedule 21.11.2019
comment
jquery 3.4.1 @PeterKA   -  person Maaz Khan    schedule 21.11.2019
comment
Привет @MaazKhan, удалите свой php-код и вставьте выходной код как html.   -  person Krishna Jonnalagadda    schedule 21.11.2019
comment
Я бы использовал .prop("checked", true/false) вместо .attr("checked", "....")   -  person PeterKA    schedule 21.11.2019
comment
@PeterKA Спасибо, сработало...   -  person Maaz Khan    schedule 21.11.2019


Ответы (2)


На самом деле, поскольку вы используете attr, когда вы отменяете выбор после массового выбора, флажок «Выбрать все» остается установленным. Пожалуйста, не стесняйтесь проверять документы о разнице между attr и prop.

$(document).ready(function() {
  $("#BulkSelect").click(function() {
    $('.Bulkers').prop('checked', this.checked);
  });

  $('.Bulkers').change(function() {
    $("#BulkSelect").prop("checked", $(".Bulkers").length === $(".Bulkers:checked").length);
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" name="BulkSelect" id="BulkSelect"/>Select All<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>
<input type="checkbox" class="Bulkers">Bulker 1<br>

person PeterKA    schedule 21.11.2019

Используйте .prop вместо .attr.

Проблема в том, что с .attr он устанавливает только атрибут checked. Однако, когда вы устанавливаете флажки, браузер обновляет свое свойство .checked, а не атрибут checked.

Используя .prop, он обновит свойство .checked флажка, поэтому оно будет синхронизировано с изменением значения.

Рабочий пример:

$(document).ready(function() {
  $("#BulkSelect").click(function() {
    $('.Bulkers').prop('checked', this.checked);
  });

  $('.Bulkers').change(function() {
    if ($(".Bulkers").length == $(".Bulkers:checked").length) {
      $("#BulkSelect").prop("checked", true);
    } else {
      $("#BulkSelect").prop("checked", false);
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input id="BulkSelect" type="checkbox" /> Select All
<hr>
<input class="Bulkers" type="checkbox" /> 0<br>
<input class="Bulkers" type="checkbox" /> 1<br>
<input class="Bulkers" type="checkbox" /> 2<br>
<input class="Bulkers" type="checkbox" /> 3<br>
<input class="Bulkers" type="checkbox" /> 4<br>
<input class="Bulkers" type="checkbox" /> 5<br>
<input class="Bulkers" type="checkbox" /> 6<br>
<input class="Bulkers" type="checkbox" /> 7<br>
<input class="Bulkers" type="checkbox" /> 8<br>
<input class="Bulkers" type="checkbox" /> 9<br>

person yqlim    schedule 21.11.2019
comment
stackoverflow.com/questions/46939538/ - person Scott Marcus; 21.11.2019