Как объединить логическое ИЛИ с логическим И в селекторе атрибутов jQuery? - PullRequest
9 голосов
/ 10 декабря 2010

С учетом следующего XML:

<users>
    <user state="CA" sex="m">Max</user>
    <user state="AZ" sex="f">Jen</user>
    <user state="OR" sex="f">Kim</user>
    <user state="NV" sex="m">Bob</user>
    <user state="CA" sex="m">Jon</user>
    <user state="AZ" sex="m">Jim</user>
    <user state="OR" sex="f">Joy</user>
    <user state="NV" sex="f">Amy</user>
</users>

Используя jQuery, можно ли выбрать пользователей мужского пола из ЦА или НВ, но без использования функции фильтра? Чтобы было ясно, я знаю, что

$(xml).find("user[sex='m']")

выбирает только пользователей мужского пола, а

$(xml).find("user[state='CA'],[state='NV']")

выбирает всех пользователей из CA или NV. Но я не могу объединить их оба с логическим И внутри одного селектора.

Однако, используя функцию фильтра, работает следующее:

$(xml).find("user").filter(function() {
    return $(this).attr('sex') == 'm' && ($(this).attr('state') == 'CA' || $(this).attr('state') == 'NV')
}).each(function() {
    alert($(this).text());
});

Спасибо!

Ответы [ 2 ]

20 голосов
/ 10 декабря 2010

Попробуйте это:

$(xml).find("user[sex='m'][state='CA'], user[sex='m'][state='NV']")

По сути, вы объединяете атрибуты sex и state в один простой селектор (это будет ваше логическое И) и повторяете их один раз для каждого состояния (и это будет ваше логическое ИЛИ).

Тест:

$(xml).find("user[sex='m'][state='CA'], user[sex='m'][state='NV']")
      .each(function() {
          alert($(this).text() + " - " + $(this).attr('state'));
      });

Выход:

Max - CA
Bob - NV
Jon - CA
1 голос
/ 10 декабря 2010

Вы можете комбинировать несколько селекторов, но ваш синтаксис не совсем правильный:

$(xml).find("user[state='CA'],[state='NV']")

Это находит все элементы с состоянием "CA" и любые другие узлы (необязательно ) с состоянием "НВ".То, что вы хотите:

$(xml).find("user[state=CA][sex=m],user[state=NV][sex=m]")

Если вы не хотите повторяться:

$(xml).find("user").filter("[state='CA'],[state='NV']").filter("[sex='m']");
...