jQuery: установка проверенного флажка

Добро пожаловать в S / O. Как правило, вы хотите предоставить более реалистичные образцы таблиц структур и данных, чтобы представить их как минимум критически важные для вашего вопроса. если когда-либо частные данные, составьте, но держите их в точном контексте.

При этом, я не думаю, что у вас на самом деле есть стол яблок, груш и яблок & amp; груши, но я буду подыгрывать.

Я предполагаю (пример), что у вас есть таблица людей и другая таблица вещей, с которой они связаны в дочерней таблице. Я бы сделал ПЕРВЫЙ на человека, для тех, кто ДЕЙСТВИТЕЛЬНО связан с записью «яблок и груш», затем сделал ЛЕВЫЙ ПОДКЛЮЧЕНИЕ к тому же дочернему столу один раз для яблок, другой для груш. Вы можете определить, что вы хотите сделать с результатами (например, удалить из отдельных яблок, записи груш ребенка).

Select
      p.LastName,
      p.FirstName,
      case when justApples.PersonID IS NULL 
           then 'No' else 'Yes' end as AlsoHasApples,
      case when justPears.PersonID IS NULL 
           then 'No' else 'Yes' end as AlsoHasPears
   from
      Person p
         JOIN Fruits f
            on p.PersonID = f.personID
            AND f.Description = 'Apples & Pears'
         LEFT JOIN Fruits justApples
            on p.PersonID = justApples.PersonID
            AND f.Description = 'Apples'
         LEFT JOIN Fruits justPears
            on p.PersonID = justPears.PersonID
            AND f.Description = 'Pears'

Так как первый «(внутренний) JOIN» явно ищет те, которые помечены как яблоки & amp; рекорд груши, который минимизирует список только тем предварительно квалифицированным людям.

Затем, два «LEFT-JOIN» явно ищут ДРУГИЕ индивидуализированные «Яблоки» и «Груши» соответственно.

При тестировании IS NULL покажет, есть ли у человека (или нет через NULL) этот предмет.

Если вы ТОЛЬКО ХОТИТЕ вернуть те, которые являются яблоками & amp; Груши И имеют один или оба других отдельных элемента, вы можете добавить в конце предложение WHERE, например

WHERE
      justApples.PersonID IS NOT NULL
   OR justPears.PersonID IS NOT NULL

. Инверсией будет предварительная квалификация justApples и justPears, а НЕ помеченная как связанная с Яблоки и Груши, такие как ТРЕБУЮЩИЕ СОЕДИНЕНИЯ к яблокам и грушам индивидуально и ЛЕВЫЕ СОЕДИНЕНИЯ с записью комбинации

Select
      p.LastName,
      p.FirstName,
      case when f.PersonID IS NULL 
           then 'No' else 'Yes' end as IsAssociatedWithApplesAndPearsRecord
   from
      Person p
         JOIN Fruits justApples
            on p.PersonID = justApples.PersonID
            AND f.Description = 'Apples'
         JOIN Fruits justPears
            on p.PersonID = justPears.PersonID
            AND f.Description = 'Pears'
         LEFT JOIN Fruits f
            on p.PersonID = f.personID
            AND f.Description = 'Apples & Pears'

Два соединения с индивидуальной ЗАПРОСОМ каждой отдельной части, и ЛЕВОЕ СОЕДИНЕНИЕ показывает, ЕСЛИ они также отмечены как комбинация записей. Как видно из неоднозначности в вашем вопросе, предоставление чуть более подробной информации о том, что вы хотите, может значительно помочь получить более точный ответ на ваши истинные потребности. Старайтесь не маскировать детали к контексту, но маскируйте сами данные примера, когда возникает проблема с более частными проблемами.

35
задан bart 6 September 2019 в 21:13
поделиться

4 ответа

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

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

В идеале вы могли бы сделать это:

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

Но, как этот ответ объясняет, jQuery использует это для анализа ] value часть условия attr = value :

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

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

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

SUPER DUPER ВАЖНОЕ РЕДАКТИРОВАНИЕ :
Эта ошибка, по-видимому, исправлена. Вы должны уметь использовать код, который я назвал «идеальным» выше.

53
ответ дан Community 27 November 2019 в 07:09
поделиться

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

$("#myform input[name='foo[]']:checked:enabled");
5
ответ дан Seb 27 November 2019 в 07:09
поделиться

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

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

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

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

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

1
ответ дан Brad Larson 27 November 2019 в 07:09
поделиться

Я считаю, что это происходит примерно так:

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

РЕДАКТИРОВАТЬ: Комментатор прав. Я должен был пойти с моим первым ответом. :) На этот раз я собираюсь использовать «^».

$("input[name^=foo] :checked");
0
ответ дан Tacoman667 27 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: