JQuery val() и флажки - программирование
Подтвердить что ты не робот

JQuery val() и флажки

Есть ли какое-то обоснование для val() бесполезно для элементов управления флажками, тогда как полезно для получения входных данных последовательно через все остальные элементы управления?

например. для флажков по умолчанию всегда возвращается "on" независимо от состояния флажка. Для других элементов управления вводами, которые фактически не имеют атрибута "значение", например, select и textarea, он ведет себя так, как вы ожидали. См:

http://jsfiddle.net/jamietre/sdF2h/4/

Я не могу придумать, почему он не вернул true или false. В противном случае, по крайней мере, верните "on" только при проверке, а пустую строку - нет. В противном случае, по крайней мере, всегда возвращайте пустую строку, учитывая, что флажки не имеют атрибута value!

Очевидно, я знаю, как получить значение с помощью attr, но вот ситуация. Я разрабатываю простую (до сих пор) реализацию С# jQuery для разбора HTML-кода на сервере, и я стараюсь быть полностью верным реализации jQuery, поэтому он ведет себя последовательно либо на клиенте, либо на сервере с той же DOM. Но это просто кажется глупым, и мне нелегко заставить себя фактически закодировать "значение", чтобы вернуть "on" для флажка независимо от того, что. Но если я этого не сделаю, это не будет последовательным. Поэтому я пытаюсь понять, есть ли какая-то причина для этого? Это служит какой-то цели, или это просто какой-то артефакт? Кто-нибудь когда-либо использовал метод val() против флажка, если да, то почему? Если нет, то почему архитекторы jQuery решили использовать этот подход, чтобы сделать его не полезным?

4b9b3361

Ответ 1

Я не могу думать о хорошей причине, почему не вернет истину или ложь. провал что, по крайней мере, верните "on" только тогда, когда checked, а пустая строка - нет. В противном случае, по крайней мере, всегда возвращайтесь пустую строку, учитывая, что флажки не имеют атрибута значения!

Флажки имеют атрибут value. Это довольно часто, чтобы использовать его, например. multi-checkboxes в формах, например:

<input type="checkbox" name="foo[]" value="1" />
<input type="checkbox" name="foo[]" value="2" />

Затем, когда пользователь отправляет форму, сервер может проанализировать, какие флажки были проверены, проверив значения массива foo[]. Значение флажка не меняет, проверено ли оно или нет; браузер просто не отправляет на сервер значения отмеченных флажков. Если вы делаете, например. $('#your-form').serialize() в jQuery, он должен работать аналогичным образом; он не должен включать значения непроверенных флажков. Если вы опустите значение из флажка, оно просто по умолчанию равно on.

Если вы хотите проверить, установлен ли флажок для отдельного пользователя или нет в jQuery, лучшим описательным способом является $(this).is(':checked')

Ответ 2

Вы говорите, что "флажки не имеют атрибута value". Напротив: атрибут value не является обязательным кроме для флажков и радиоокна.

Из спецификации W3C:

[атрибут value] является необязательным, за исключением случаев, когда атрибут type имеет значение "радио" или "флажок"

on - значение по умолчанию, которое ваш браузер предоставляет элементу при игнорировании спецификации и не устанавливает атрибут value.

Вам нужно помнить, что означает значение: оно отправляется с name элемента на сервер при отправке формы. Если он не установлен, значение не отправляется. Поэтому значение on отправляется только при установленном флажке.

Ответ 3

Возможно, это должно помочь

$(document).ready(function() {
    $('input[type=checkbox]').click(function() {
      alert("val="+$(this).val()+",checked="+$(this).attr('checked'));
    });

});

Используйте input[type=checkbox], чтобы выбрать input type="checkbox", поскольку флажок установлен и введен с типом = "флажок"

И добавьте также атрибут value.

Вкл jsfiddle

UPDATE

<form method="post" action="#">
    PHP<input type="checkbox" name="ch[]" value="PHP"><br/>
    JS<input type="checkbox" name="ch[]" value="JS"><br/>
    JAVA<input type="checkbox" name="ch[]" value="JAVA"><br/>
    PYTHON<input type="checkbox" name="ch[]" value="PYTHON"><br/>
    <input type="submit" name="submit"/>
</form>

И php

if($_POST){
foreach($_POST['ch'] as $post => $value){
    echo "$post -> $value <br/>";
}
}

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

Другим способом является

if($_POST){
    foreach($_POST as $post => $value){
        echo "$post -> $value <br/>";
    }
}

<form method="post" action="#">
    PHP<input type="checkbox" name="PHP"><br/>
    JS<input type="checkbox" name="JS"><br/>
    JAVA<input type="checkbox" name="JAVA"><br/>
    PYTHON<input type="checkbox" name="PYTHON"><br/>
    <input type="submit" name="submit"/>
</form>

Но предыдущий, кажется, добавляет более динамичный и менее утомительный (я бы поверил).

А что касается вопроса @Capsule

alert("val="+$(this).val()+",checked="+$(this).attr('checked'));
<input type="checkbox"> Check me.

возвращает значение on, я считаю, что значение по умолчанию для флажка.

И второй эксперимент также дает значение on.

Надеюсь, я не ошибаюсь.

Ответ 4

Если вы передадите массив в функцию val, он установит флажок, как отмечено, если значение флажка соответствует значению в массиве. Источник: http://api.jquery.com/val/#val-value

<input id="checkbox" type="checkbox" value="remember">    

$("#checkbox").val(["remember"]);

Ответ 5

Флажок

Не всегда один и его значение передается при отправке формы (в противном случае имя/значение вообще не передается).

Очень полезно при создании массивов из флажков, вы можете использовать name="test[]" в качестве своего имени и устанавливать разные значения в каждом. При анализе представленного результата вы получаете массив, содержащий все проверенные значения

Ответ 6

Флажок имеет значение, как текстовое поле, и это значение отправляется на сервер при отправке формы только в том случае, если флажок был выбран во время отправки.

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

Итак, метод .val() работает просто отлично, возвращая значение элемента.

Вы правы, что в jQuery отсутствует простой способ увидеть, установлен ли определенный флажок/переключатель, что-то вроде $("#mycheckbox").checked(), но для чего у нас есть плагины.:)