jQuery val () y casillas de verificación

¿Hay alguna razón para que val() sea ​​inútil para los controles de checkbox, mientras que es útil para obtener datos de entrada de manera consistente en todos los demás controles de entrada?

por ejemplo, para las casillas de verificación, en parece que siempre vuelve “on” independientemente del estado de la checkbox. Para otros controles de entrada que en realidad no tienen un atributo de “valor”, por ejemplo, select y textarea, se comporta como cabría esperar. Ver:

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

No puedo pensar en una buena razón por la que no volvería true o false . Si falla, al menos devuelva “on” solo cuando esté marcado, y una cadena vacía cuando no lo esté. Si falla, al menos siempre devuelva una cadena vacía, dado que las casillas de verificación no tienen ningún atributo de value .

Obviamente, sé cómo obtener el valor usando attr , pero aquí está la situación. Estoy desarrollando una implementación simple de C # jQuery para hacer análisis de HTML en el servidor, y estoy tratando de ser completamente fiel a la implementación de jQuery para que se comporte de manera consistente en el cliente o servidor contra el mismo DOM. Pero esto simplemente parece estúpido y me está costando mucho conseguir que realmente codifique el “valor” para volver a “ACTIVAR” para una checkbox sin importar qué. Pero si no lo hago, no será consistente. Así que estoy tratando de entender, ¿hay alguna razón para hacer esto? ¿Tiene algún propósito o es simplemente un artefacto de algún tipo? ¿Alguien usaría el método val() contra una checkbox, si es así, por qué? Si no, ¿por qué los arquitectos de jQuery decidieron este enfoque para que no fuera útil?

No puedo pensar en una buena razón por la que no volvería verdadero o falso. Si falla, al menos devuelva “on” solo cuando esté marcado, y una cadena vacía cuando no lo esté. Si falla, al menos siempre devuelva una cadena vacía, dado que las casillas de verificación no tienen ningún atributo de valor.

Las casillas de verificación tienen un atributo de valor. Es bastante común usarlo en eg. casillas múltiples en formularios, por ejemplo:

   

Luego, cuando el usuario envía el formulario, el servidor puede analizar cuál de las casillas de verificación se seleccionó al verificar los valores de la matriz foo[] . El valor de la checkbox no cambia si se marca o no; el navegador simplemente no envía los valores de las casillas de verificación sin marcar al servidor. Si lo haces por ejemplo. $('#your-form').serialize() en jQuery, debería funcionar de manera similar; no debe incluir valores de casillas de verificación sin marcar. Si omite el valor de la checkbox, simplemente se activará de forma predeterminada.

Si desea verificar si una checkbox individual está marcada o no en jQuery, la mejor manera más descriptiva es hacer $(this).is(':checked')

Usted dice que “las casillas de verificación no tienen ningún atributo de value “. Por el contrario: el atributo de value es opcional, excepto en casillas de verificación y casillas de radio.

De las especificaciones del W3C :

[el atributo de value ] es opcional, excepto cuando el atributo de tipo tiene el valor “radio” o “checkbox”

on es el valor predeterminado que su navegador le da al elemento cuando ignora la especificación y no establece un atributo de value .

Debe recordar lo que significa el valor: se envía con el name del elemento al servidor cuando se envía el formulario. Si no se marca, el valor no se envía. Por lo tanto, el valor activado solo se envía cuando se marca la checkbox.

Quizás esto debería ayudar

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

Use la input[type=checkbox] para seleccionar input type="checkbox" ya que checkbox es y input con type = “checkbox”

Y también poner el atributo de valor en la checkbox.

En jsfiddle

ACTUALIZAR

 
PHP
JS
JAVA
PYTHON

Y php

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

Todos comparten el mismo nombre, ya que son un grupo común de botones. Usted sabe cuál fue verificado y cuál no fue a través de sus valores.

La otra forma es

 if($_POST){ foreach($_POST as $post => $value){ echo "$post -> $value 
"; } }
PHP
JS
JAVA
PYTHON

Pero lo anterior parece agregar más dynamics y menos tediosos (creo que).

Y en cuanto a la pregunta de @Cápsule.

 alert("val="+$(this).val()+",checked="+$(this).attr('checked'));  Check me. 

devuelve el valor on creo que ese es el valor predeterminado de la checkbox.

Y el segundo experimento también da el valor.

Espero no estar equivocado.

Si pasa una matriz a la función val, establecerá la checkbox como seleccionada si el valor de la checkbox coincide con el valor de la matriz. Fuente: http://api.jquery.com/val/#val-value

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

Una checkbox no siempre está sola y su valor se pasa al enviar el formulario (de lo contrario, el nombre / valor no se pasa en absoluto).

Es muy útil cuando haces matrices con casillas de verificación, puedes usar name="test[]" como su nombre y establecer diferentes valores en cada una. Al analizar el resultado enviado, terminas con una matriz que contiene todos los valores marcados

La checkbox tiene un valor igual que el cuadro de texto y este valor se envía al servidor cuando el formulario se envía solo si la checkbox se seleccionó en el momento del envío.

A diferencia de la casilla de texto, la checkbox tiene un valor predeterminado que está on : se envía al servidor cuando se selecciona la checkbox pero no tiene un value propio, de modo que el código de procesamiento pueda saber que se seleccionó.

Entonces, el método .val() está funcionando bien, devolviendo el valor del elemento.

Tienes razón en que a jQuery le falta una forma sencilla de ver si se selecciona una checkbox / botón de radio específico, algo así como $("#mycheckbox").checked() pero para eso tenemos los complementos. 🙂