2009-04-14 1 views
32

Предположим, у меня есть следующий HTML:JQuery: Выбор проверил флажок

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

Теперь, как я выбираю проверенные поля ввода с именем 'Foo []?

Это моя попытка, но она не работает:

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

Umn, что у вас там работает просто отлично, просто использовать двойные кавычки вокруг вашего выбора. :) – cgp

+1

Да; помните, что мой первоначальный ответ - не лучший способ сделать это. У jQuery были проблемы с скобками в селекторе, но это было исправлено, поэтому вы должны иметь возможность сохранить то, что у вас есть, просто используйте двойные кавычки вокруг селектора. –

ответ

45

Имя поля не foo, это foo[]. Вы можете использовать attributeStartsWith селектор:

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

В идеале, вы бы быть в состоянии сделать это:

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

Но this answer объясняет, JQuery использует это, чтобы разобрать value часть условия attr=value:

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

\ 3 является группой, содержащей отверстие кавычки, которым, как правило, разрешено быть несколько открывающих котировок, или вообще не открывать кавычки. . *? затем может анализировать любой символ, включая кавычки, пока он не ударит по первому символу ']', заканчивая совпадение. Не существует резервных копий специальных символов CSS с обратной косой чертой, поэтому вы не можете сопоставить произвольное строковое значение в jQuery.

Другими словами, как только jQuery попадает в первый ], он считает, что значение закончено. Таким образом, вы застряли в startWith или используете чистые элементы DOM, так как этот ответ также объясняет.

супер пупер ВАЖНО EDIT:
Эта ошибка исправлена, по-видимому. Вы должны иметь возможность использовать код, который я назвал «идеальным», выше.

+0

Я считаю, что это ошибка, и это связано с исправлением: http://dev.jquery.com/ticket/3443 – cgp

+0

Это не исправлено в jQuery 1.3.2, которая, как представляется, является последней общедоступной версией. – bobince

+0

Это исправлено в моем 1.3.2 .... –

0

Я считаю, что идет что-то вроде этого:

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

EDIT: Комментатор прав. Я должен был пойти с моим первым ответом. :) На этот раз я собираюсь использовать «^».

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

Однако [] может быть worng :) – Tacoman667

+0

#xyz для атрибутов 'id', а не 'name'. – bobince

4

Вы должны процитировать атрибут при выборе и включают []:

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

Это не сработает, к сожалению. Парсер jQuery заканчивается на первом], он встречается, поэтому [] в этом случае недопустимы. –

+1

Действительно. Это ошибка; см. http://stackoverflow.com/questions/739695 для обсуждения. – bobince

+0

Старая ошибка. Это исправлено, если вы используете последнюю версию с оценкой, так как вы можете увидеть мой пример. – cgp

1

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

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

Вы можете увидеть его в действии здесь: http://jsbin.com/oyoro

Обратите внимание, что Jquery имел проблемы и выключаться с кронштейнами в прошлом, что может объяснить много путаницы окружающей необходимости побега. Я знаю, что у меня была проблема с скобками и просто цитированием.

См: http://dev.jquery.com/ticket/3443

+0

* бормотание * * бормотание * * бормотание * Если я ошибаюсь, я откажусь, но пример есть. – cgp

+0

Touche, добрый сэр. -1 удалено, +1. Я обновил свой ответ с помощью этих новых знаний. –

+0

Извините за путаницу, я шел мимо того, что сказал bobince в ответ несколько дней назад, поэтому я решил, что это текущая вещь. В следующий раз проверит меня. –