2013-08-26 4 views
-1

По какой-то причине мой код не работает ?! Мне нужно проверить флажки, если все «не отмечены», затем включить скрытое поле и отправить значение в db, поэтому я могу определить, что флажки не отмечены.JQuery - Как я могу проверить, не сняты ли все флажки?

Вопрос 1: Почему мой код jquery не работает?

Вопрос 2: Мне нужно записать отмеченные или непроверенные значения в БД. Мой план состоит в том, чтобы проверить, не выбраны ли в php. Это хорошая практика?

HTML

<tr class="more_info"> 
     <th valign="top">Other options:</th> 
     {foreach from=$HTML_cOPTIONS key=dbname item=optname} 
      {if ! empty($CARINFO[car].{$dbname})} 
       <td><input type="checkbox" id="forced_checkbox" name="c_options[]" value="{$dbname}" checked/> {$optname} </br></td> 
      {else} 
       <td><input type="checkbox" id="forced_checkbox" name="c_options[]" value="{$dbname}"/> {$optname} </br></td> 
      {/if} 
     {/foreach} 
     <input type="hidden" id="forceSendCheckBox" name="c_options[]" value="nocheckboxes"/> 
     <input type="button" value="Check" id="check" /> 
    </tr> 

Jquery

$('#check').bind('click',function() 
{ 
    if ($('#forced_checkbox').filter(':not(:checked)').length == 0) { 
     console.log('at least one checked'); 
     $("#forceSendCheckBox").prop('disabled',true);//do not send this field to DB 
    } else { 
     console.log('nothing checked'); 
     $("#forceSendCheckBox").prop('disabled',false);//send empty checkboxes 
    } 
}); 

UPDATE

Вот скрипка, она до сих пор, кажется, сломана. : -/

http://jsfiddle.net/L5J96/

+0

Почему ваш заголовок говорит, что вам нужно проверить, все ли проверены, но в вашем описании говорится, что вам нужно спросить, не все ли они сняты? –

+0

У вас нет элемента 'id =" check "'. – musicnothing

+0

@ crazy train, это была опечатка. У вас более 2000 реп, и не удалось изменить опечатку ?! Тебе потребовалось больше времени, чтобы прокомментировать. – Tatarin

ответ

9

идентификаторы должны быть уникальными. Вместо этого используйте класс.

В вашей скрипке у вас было несколько проблем. Во-первых, вы забыли выбрать структуру jQuery из меню, поэтому ни один из jQuery-кода не работал. Во-вторых, вы изменили фильтр с not(:checked) на (:checked), но не изменили == 0 на > 0. В-третьих, без not, вы не должны иметь круглые скобки вокруг селектора фильтров. В-четвертых, вы попытались отобразить сообщение в поле ввода с помощью .text(), но правильный метод - .val().

Вот исправленный код:

$('#check').on('click', function() { 
    if ($('.forced_checkbox').filter(':checked').length > 0) { 
     $('#forceSendCheckBox').val('at least one checked'); 
    } else { 
     $('#forceSendCheckBox').val('nothing checked'); 
    } 
}); 

FIDDLE

+0

Я пробовал, что, похоже, не помогло, я также прикрепил скрипку к сообщению – Tatarin

+0

Я исправил все проблемы в вашей скрипке. – Barmar

+0

Собственно, изменил мой ответ и выбрал ваш. Я привязал событие к флажкам, и это работает как шарм. Я думаю, что основная часть информации, которую я отсутствовала, была> знаком. Благодарю. – Tatarin

1

Как уже упоминалось Barmar, идентификаторы должны быть уникальными.

Далее, используйте .on() вместо .bind() - аналогичный синтаксис, поэтому его легко сделать. (.bind устарел)

Однако, чтобы ответить на ваш вопрос, вы можете быстро узнать, какие флажки не были проверены, выбирая все отмеченные флажки и итерации через них.

Если вам нужно создать список флажков, отмеченных флажками, то вам нужно что-то уникальное в каждом из них (если каждый человек в комнате называется «Боб», а затем делает полезный список всех мужчин с каштановыми волосами будет сложно). Используйте ID attr для этого, как в примере jsFiddle внизу.

$("input:checkbox:not(:checked)").each(function() { 
    alert($(this).attr('id')); 
}); 

jsFiddle here

Here is an expanded jsFiddle example, который демонстрирует, как сохранить список непроверенных флажков в скрытом поле, как это предусмотрено в вашем посте.


Что касается вашего jsFiddle, следующие вещи необходимо регулировочного:

See revised jsFiddle

  1. Использование синтаксиса .on(). Используйте .on(document) или .on(body) вместо:

    $('document').on('action', '#elementID', function() { //Do stuff here });

  2. Для interate через коллекцию непроверенных объектов, вы должны использовать .each() метод JQuery в.

    $('.forced_checkbox').filter(':not(:checked)').each(function() { //Do stuff });

Надеется, что это помогает.

+0

Я изменил с bind() на on() и заменил идентификаторы классом, он все еще не работает – Tatarin

+0

http://jsfiddle.net/L5J96/ – Tatarin

+0

Спасибо за jsFiddle. [Попробуйте это: http://jsfiddle.net/L5J96/1/](http://jsfiddle.net/L5J96/1/). Надеюсь, это то, что вы хотите. Обратите внимание, что вы можете использовать уникальные атрибуты идентификатора, если хотите отслеживать **, которые ** флажки не отмечены. – gibberish

Смежные вопросы