jQuery val () и флажки - PullRequest
       3

jQuery val () и флажки

58 голосов
/ 11 апреля 2011

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

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

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

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

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

Ответы [ 6 ]

70 голосов
/ 11 апреля 2011

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

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

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

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

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

11 голосов
/ 11 апреля 2011

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

С технические характеристики W3C :

[атрибут value] является необязательным, за исключением случаев, когда атрибут type имеет значение «radio» или «checkbox»

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

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

5 голосов
/ 11 апреля 2011

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

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

});

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

А также поместите атрибут значения в флажок.

Вкл. jsfiddle

ОБНОВЛЕНИЕ

<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.

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

3 голосов
/ 18 августа 2014

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

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

$("#checkbox").val(["remember"]);
2 голосов
/ 11 апреля 2011

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

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

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

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

1 голос
/ 11 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...