Отключить несколько флажков с помощью javascript

#php #javascript

#php #javascript

Вопрос:

У меня проблема с моей функцией JS. Я объясню это вам с помощью моего кода и Prt Sc.

Code = http://jsfiddle.net/dKeRf /

Это функция Php и функция JS.

Экран = http://img824.imageshack.us/i/antoe.png /

Если установлен один из 2 флажков над таблицей, все флажки в таблице two должны быть отключены. На данный момент это работает для первого флажка, но не для второго, и я спрашиваю вас, почему ? 🙂

Я использую ’10’ в моем jut ‘For’ для теста, я изменю это значение на номер строки таблицы.

Спасибо за вашу помощь и хорошего дня !

Комментарии:

1. Вставьте код прямо здесь вместо внешних источников. И не забудьте очистить его синтаксис, потому что никто не любит читать беспорядочный код.

Ответ №1:

Добавьте класс ко всем флажкам:

 <input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'>
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'>
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'>
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'>
  

Затем используйте jquery для обновления всех флажков одновременно:

 <script>
$(document).ready(function(){
    $(".selectAll").click(function() {
        if($(".selectAll").attr("checked")) {
            $(".the_checkbox:checkbox").attr("disabled", true);
        } else {
            $(".the_checkbox:checkbox").removeAttr("disabled");
        }
    });        
});
</script>
  

ОБНОВЛЕНИЕ: изменяет ответ на использование .class name для обновления флажков вместо идентификатора, чтобы идентификатор мог оставаться уникальным и соответствовать стандартам HTML.

Комментарии:

1. Спасибо за ваш ответ! Но флажок не может иметь одинаковый идентификатор, это не работает. я попробую использовать jQuery, возможно, это мне поможет. Я также почищу свой код и опубликую его.

2. Я не уверен, что вы подразумеваете под «Это не работает» со всеми одинаковыми идентификаторами. Есть ли что-то еще, что вы делаете с идентификатором, который требует, чтобы все они были разными? Если нет, это сработает. Я протестировал это, поэтому я знаю, что это будет работать со всеми одинаковыми идентификаторами. Следуйте моему примеру выше. Присвоите флажку, который отключает все остальные флажки, класс selectAll (class=»selectAll»), а флажкам, которые необходимо отключить, идентификатор cpt2 (id =»cpt2″) и используйте код jquery, который я опубликовал, и это сработает.

3. Я бы действительно посоветовал отказаться от этого. Согласно спецификации HTML, идентификаторы должны быть уникальными. Хотя да, jQuery все еще будет работать, document.getElementById() не будет. И если вы когда-нибудь захотите изучить JavaScript и освободиться от зависимости от jQuery, вам понадобится document.getElementById().

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

5. Я обновил свой ответ. Теперь вы можете убрать голосование «против». 😉

Ответ №2:

Идентификаторам не разрешается начинаться с цифры, они должны начинаться с буквы. Так document.getElementById(1234) произойдет сбой (я думаю, IE мог бы ничего не говорить и разрешить это, но FF не работает). Вы должны быть в порядке, просто поставив букву перед номером и изменив getElementById на document.getElementById('cb' id2); .

Также, просто побочное замечание, если вы передаете в this функцию onClick , этот параметр является ссылкой на элемент, на который был нажат. Таким образом, нет необходимости получать box.id , а затем делать document.getElementById(checkId) . технически document.getElementById(checkId) это === box так что вы могли бы просто сказать box.checked .

http://www.w3.org/TR/html4/types.html#h-6.2 . Это спецификация, в которой говорится о требованиях к именованию атрибутов ID:

Маркеры идентификатора и ИМЕНИ должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисов («-«), подчеркиваний («_»), двоеточий («:») и точек («.»).

Редактировать:

Еще лучше, чем использовать document.getElementById() для установки каждого флажка, было бы использовать document.getElementById() для родительского элемента, для которого флажки, которые вы хотите отключить, являются общими (например, для таблицы, в которой они находятся), а затем использовать document.getElementsByTagName('input') для получения коллекции всех флажков и зацикливания / отключения их с помощью этого. Таким образом, код отключения JS будет выглядеть следующим образом:

Некоторая таблица:

 <input type='checkbox' onClick='checkCBs(this,"someTable1");'>
<table id='someTable1'>
  <tr>
    <td>This is checkbox 1:</td>
    <td><input type='checkbox' name='group1' value='checkbox1'></td>
  </tr>
  <tr>
    <td>This is checkbox 2:</td>
    <td><input type='checkbox' name='group1' value='checkbox2'></td>
  </tr>
</table>
  

Код:

 function checkCBs(box, parent){
    var parent = document.getElementById(parent),
        CBs = parent.getElementsByTagName('input'),
        i;
    //loop through all input elements
    for(i=0;i<CBs.length;i  ){
        //make sure the input is a checkbox
        if(CBs[i].type amp;amp; CBs[i].type=='checkbox'){
            //set disabled on this checkbox to opposite
            //of whether box is checked.
            CBs[i].disabled = !box.checked;
        }
    }

}
  

Комментарии:

1. Кажется, это начало элегантного решения. Есть ли способ устранить цикл for? Если нет, то, по крайней мере, для повышения производительности (хотя она может быть небольшой), значение CBs.length должно быть заданным значением перед циклом for, чтобы вам не приходилось вызывать функцию ‘length’ для каждой итерации в цикле.

2. правильно, CBs.length должен быть установлен перед циклом, я просто ленился. Что касается for цикла, то он обязателен. В DOM нет способа повлиять на несколько элементов в коллекции / объекте / массиве без перебора их и воздействия на каждое отдельное значение. Даже в jQuery вы вызываете его одним вызовом функции, но он все равно будет перебирать эти элементы и воздействовать на каждый из них по отдельности. Вы могли бы написать функцию, которая сделает это за вас (то же самое, что и при использовании jquery), но, вероятно, это не принесет большой пользы.

3. Спасибо за вашу помощь, Джонатан, cdburgess и afuzzyllama, я попробую решение Джонатана, чтобы решить мою проблему! parent.getElementsByTagName кажется, очень хороший способ сделать это. Спасибо!