Прокрутіть прапорці та підрахуйте кожну, позначену чи не позначену


82

Я трохи зіткнувся з проблемою. Ось коротке пояснення.

У мене є 12 прапорців на стандартній формі. Що мені потрібно зробити, це прокрутити кожен із них і дізнатися, які з них перевіряються, а які - не.

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

(Check1 - перевірено)
(Check2 - не перевірено)
(Check3 - перевірено)

1,0,1

Поки що я отримав цей фрагмент коду.

$('input[type=checkbox]').each(function () {
           if (this.checked) {
               console.log($(this).val()); 
           }
});

Це чудово працює, за винятком того, що повертає лише перевірені, а не всі.

Вибачте за нове запитання. Я якось новачок у jquery.


5
Вам слід переробити схему бази даних.
Слакс

Як переробити дизайн? Чи не зберігати групу прапорців в одному полі краще, ніж мати одне поле для кожного прапорця?
Richard M

4
Це, очевидно, залежить від того, якими є прапорці, але, мабуть, слід використовувати або окремі поля, або дочірню таблицю (з одним полем на рядок на [прапорець])
SLaks

"Чи не зберігати групу прапорців в одному полі краще, ніж мати одне поле для кожного прапорця?" Ні, оскільки ваші одиниці та нулі не зберігаються як біти, вони зберігаються як байти. Якщо причина збереження списку бітів із розділеними комами значенням в одному полі полягає в ефективності, тоді загубіть кому та використовуйте побітові операції та маски . Хоча в наші дні mysql застосував бітовий тип даних, тому побітові та маски можуть не знадобитися, якщо ви не програмуєте чіпи кредитних карток або вам не потрібно щось надзвичайно швидко.
Blue Water

Відповіді:


127

Щоб побудувати рядок результатів точно у форматі, який ви показуєте, ви можете використовувати це:

var sList = "";
$('input[type=checkbox]').each(function () {
    sList += "(" + $(this).val() + "-" + (this.checked ? "checked" : "not checked") + ")";
});
console.log (sList);

Однак я б погодився з @SLaks, я думаю, вам слід переглянути структуру, в яку ви будете зберігати це у своїй базі даних.

EDIT : Вибачте, я неправильно прочитав вихідний формат, який ви шукали. Ось оновлення:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);

1
Як я розумію, він хоче рядок на 1s і 0s.
Слакс

Дякую. Я спробую це і повідомлю вас.
Richard M

Хм Я спробував це, але він показав весь файл js у журналі консолі.
Richard M

1
Я не можу цим користуватися, але мені потрібно використовувати $ (this)
V-SHY

1
@ Si8 - Я оновив скрипку, тому код ігнорує невстановлені прапорці, що має полегшити зайві коми: jsfiddle.net/m4k6vj8x
Ед Шембор

61

Використання селекторів

Ви можете отримати всі позначені прапорці таким чином:

var boxes = $(":checkbox:checked");

І всі не перевірені так:

var nboxes = $(":checkbox:not(:checked)");

Ви можете просто прокрутити одну з цих колекцій і зберегти ці імена. Якщо що-небудь відсутнє, ви знаєте, що воно було або не перевірено. У PHP, якщо у вас був масив імен, які перевірялися, ви можете просто зробити in_array()запит, щоб дізнатись, чи слід перевіряти якийсь конкретний пункт пізніше.

Серіалізувати

jQuery також має метод серіалізації, який буде підтримувати стан елементів керування формою. Наприклад, наведений приклад на веб-сайті jQuery:

single=Single2&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio2

Це дозволить вам зберегти інформацію, для яких елементів також було перевірено.


16

Ви можете прокрутити всі прапорці, написавши $(':checkbox').each(...).

Якщо я правильно зрозумів ваше запитання, ви шукаєте такий код:

var str = "";

$(':checkbox').each(function() {
    str += this.checked ? "1," : "0,";
});

str = str.substr(0, str.length - 1);    //Remove the trailing comma

Цей код прокручує всі прапорці та додає 1,або 0,до рядка, або до нього.


Дякую. Спробую і це спробувати.
Richard M

Ви також можете використовувати атрибут value. Якщо ви намагаєтеся створити двійкове значення, то надайте кожному прапорець величину, рівну 2, і просто складіть перевірені, сума в двійковому вигляді буде такою ж, як додані та нулі. Ви обмежитеся 32 прапорцями (найбільшим числовим значенням є 2 ^ 32 у JavaScript [я думаю, може бути 64]. Кращий дизайн бази даних буде більш гнучким)
Джейсон Сперске

0

Я не думаю, що достатньо часу було приділено увазі до міркувань щодо схеми, викладених в оригінальному дописі. Отже, тут є що врахувати будь-яким новачкам.

Скажімо, ви пішли далі і створили це рішення. Усі ваші службові значення об'єднуються в одне значення та зберігаються в базі даних. Ви справді економите [трохи] місця у вашій базі даних і трохи часу на кодування.

Тепер давайте розглянемо, що ви повинні виконувати часте і легке завдання, додаючи новий прапорець між поточними прапорцями 3 та 4. Ваш менеджер з розвитку, замовник, незалежно від того, що очікує, що це буде проста зміна.

Отже, ви додаєте прапорець до інтерфейсу користувача (найпростіша частина). Ваш цикл циклу вже поєднує значення незалежно від кількості прапорців. Ви також вважаєте, що поле бази даних - це просто varchar або інший тип рядка, тому воно також повинно бути нормальним.

Що трапляється, коли клієнти чи ви намагаєтесь переглянути дані до зміни? Ви по суті серіалізуєтеся зліва направо. Однак тепер значення після 3 усі відхиляються на 1 символ. Що ви збираєтеся робити з усіма вашими наявними даними? Ви збираєтеся написати програму, витягнути її з бази даних, обробити, щоб додати значення за замовчуванням для нової позиції запитання, а потім зберегти все назад у базі даних? Що відбувається, коли у вас є кілька нових значень на тиждень чи місяць? Що робити, якщо ви переміщуєте розташування та jQuery обробляє їх в іншому порядку? Усі ваші дані шлангові, і їх потрібно повторно обробити, щоб переставити їх.

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


-1
$.extend($.expr[':'], {
        unchecked: function (obj) {
            return ((obj.type == 'checkbox' || obj.type == 'radio') && !$(obj).is(':checked'));
        }
    });

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