2009-04-14 27 views
32

Supongamos que tengo el código HTML siguiente:jQuery: Al seleccionar la casilla de verificación marcada

<form id="myform"> 
    <input type='checkbox' name='foo[]'/> Check 1<br/> 
    <input type='checkbox' name='foo[]' checked='true'/> Check 2<br/> 
    <input type='checkbox' name='foo[]'/> Check 3<br/> 
</form> 

Ahora, ¿cómo puedo seleccionar los campos de entrada controladas con el nombre 'foo []'?

Este es mi intento, pero no funciona:

$('#myform input[name='foo']:checked:enabled'); 
+0

Umn, lo que tiene no funciona bien, sólo tiene que utilizar comillas dobles alrededor de su selector. :) – cgp

+1

Sí; tenga en cuenta que mi respuesta inicial no es la mejor manera de hacerlo. jQuery solía tener problemas con los corchetes en el selector, pero esto se ha solucionado, por lo que debería poder conservar lo que tiene, simplemente use comillas dobles alrededor del selector. –

Respuesta

45

El nombre del campo no es foo, es foo[]. Se podría utilizar el selector de attributeStartsWith:

$("input[name^='foo']:checked:enabled",'#myform'); 

Idealmente, usted sería capaz de hacer esto:

$("input[name='foo[]']:checked:enabled",'#myform'); 

Pero como explica this answer, jQuery utiliza esto para analizar la parte value de la condición attr=value:

(['"]*)(.*?)\3|)\s*\] 

\ 3 siendo el grupo que contiene la abertura citas, que extrañamente pueden ser múltiples citas de apertura, o sin citas de apertura. Los .*? a continuación, puede analizar cualquier carácter, incluidas las comillas hasta que llegue al primer carácter ']', finalizando la coincidencia. No hay ninguna disposición para los caracteres especiales CSS de escape de barra invertida, por lo que no puede hacer coincidir un valor de cadena arbitrario en jQuery.

En otras palabras, tan pronto como jQuery golpea el primer ] cree que el valor ha terminado. Así que estás atrapado con inicios con o usando elementos DOM puros, como esa respuesta también explica.

Super Duper EDITAR IMPORTANTE:
Este error se corrige, al parecer. Debería poder usar el código que describí como "ideal", arriba.

+0

Creo que este es el error y está relacionado con la corrección: http://dev.jquery.com/ticket/3443 – cgp

+0

No está solucionado en jQuery 1.3.2, que parece ser la última versión disponible en general. – bobince

+0

Está fijado en mi 1.3.2 .... –

0

Creo que es algo como esto:

$("input #foo[] :checked"); 

EDIT: El comentarista es correcto. Debería haber ido con mi primera respuesta. :) Esta vez voy a usar el "^".

$("input[name^=foo] :checked"); 
+0

Sin embargo, el [] puede estar funcionando :) – Tacoman667

+0

#xyz es para atributos 'id', no 'nombre'. – bobince

4

Usted debe citar el atributo al seleccionar e incluir []:

$("#myform input[name='foo[]']:checked:enabled"); 
+1

Esto no funcionará, desafortunadamente. El analizador jQuery termina al principio] se encuentra, por lo que [] no están permitidos en este caso. –

+1

De hecho. Esto es un error; ver http://stackoverflow.com/questions/739695 para la discusión. – bobince

+0

Un viejo error. Se soluciona si está usando la versión más reciente de manera comprensiva, como puede ver en mi ejemplo. – cgp

1

En realidad, lo que tiene funciona muy bien, sólo tiene que utilizar comillas dobles, e incluye los soportes para que pueda igualar.

$("#myform input[name='foo[]']:checked:enabled"); 

Se puede ver en acción aquí: http://jsbin.com/oyoro

Tenga en cuenta que jQuery ha tenido problemas de encendido y apagado con soportes en el pasado, lo que puede explicar gran parte de la confusión que rodea a la necesidad de escapar. Sé que he tenido problemas con corchetes y solo estoy citando.

Ver: http://dev.jquery.com/ticket/3443

+0

* murmurar * * murmurar * * murmurar * Si me equivoco, me retractaré, pero el ejemplo está ahí. – cgp

+0

Touche, amable señor. -1 eliminado, +1. He actualizado mi respuesta con este nuevo conocimiento. –

+0

Perdón por la confusión, estaba pasando por lo que Bobince había dicho en una respuesta hace unos días, así que pensé que era algo actual. Lo comprobaré la próxima vez. –

Cuestiones relacionadas