jQuery Определите, имеет ли сопоставленный класс заданный идентификатор

96

Что такое jQuery имеет идентификатор, эквивалентный следующему утверждению?

$('#mydiv').hasClass('foo')

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

что-то вроде:

$('.mydiv').hasId('foo')
Николас Мюррей
источник
Я хочу применить стиль к определенному div. Например, во время загрузки будут показаны все с классом foo, но я могу отключить один экземпляр класса foo с идентификатором bar.
Николас Мюррей,
1
Тогда вы просто сделаете, $('#bar.foo').toggle();что у вас будет только один идентификатор, поскольку они НЕОБХОДИМЫ, чтобы быть уникальными для документа. Если вы хотите переключать только этот идентификатор, если он относится к классу, fooпросто добавьте класс в селектор идентификаторов. если селектор найдет пустой набор, ничего не произойдет, если он найдет набор с результатами (из которых будет только один), то он переключит элемент. Я думаю, вы слишком много думаете об этом.
prodigitalson
3
просто сказать, что люди разочаровываются, говоря: «Зачем вам вообще это нужно?» когда я пытаюсь сделать это прямо сейчас. Проблема с hasClass в том, что он возвращает True, если ЛЮБОЙ элемент, который соответствует селектору, имеет данный класс. Итак, когда у меня много p с классом «cake» и дополнительными именами классов для каждого («one», «two» и т. Д.), У меня возникает проблема. Я хочу выбрать общий набор p.cake, а затем иметь условный (если class = "one" - $ var = 23 - и т. Д.). Дело в том, что я пытаюсь передать другой $ var в зависимости от имени дополнительного класса. Я стараюсь не повторять все это целиком
Стелла

Ответы:

171

Вы можете встроить эту логику в селектор, объединив несколько селекторов . Например, мы могли бы настроить таргетинг на все элементы с данным идентификатором, которые также имеют определенный класс:

$("#foo.bar"); // Matches <div id="foo" class="bar">

Это должно быть похоже на то, что вы бы написали в CSS. Обратите внимание, что он не будет применяться ко всем #fooэлементам (хотя должен быть только один) и не будет применяться ко всем .barэлементам (хотя их может быть много). Он будет ссылаться только на элементы, соответствующие обоим атрибутам.

В jQuery также есть отличный .isметод, который позволяет определить, обладает ли элемент определенными качествами. Вы можете протестировать коллекцию jQuery с помощью селектора строк, элемента HTML или другого объекта jQuery. В этом случае мы просто проверим его по селектору строк:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'
Сампсон
источник
32
+1 за is(). Должен быть .hasId()селектор только потому, что он кажется очевидным партнером для .hasClass()действительно ...
Мэтт Флетчер
43

Я бы, вероятно, использовал $('.mydiv').is('#foo');Это сказано, если вы знаете идентификатор, почему бы вам просто не применить его к селектору?

блудница
источник
17
Возможно, код переходит в функцию обратного вызова, которая должна обрабатывать определенный случай по-другому. Итак, функции автоматически передается объект jQuery с неизвестными атрибутами. В этом случае $ ('ваш ответ'). Is ('полезно');
Peter G
1
Я могу придумать любое количество причин. Что делать, если вы хотите применить настройку для мобильных устройств, например, если элемент имеет id = "mobile". Почему не важно.
Дата размещения
Что ж, только 1 элемент должен когда-либо иметь данный, idиначе это должен быть какой-то другой атрибут ... Я полагаю, если структурное расположение рассматриваемого элемента изменяется в зависимости от страницы или клиента / агента пользователя, тогда нормально, но кроме этого .. .
prodigitalson
19

обновление: извините, неправильно понял вопрос, удален .has()ответ.

другой альтернативный способ, создать .hasId()плагин

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>

ewwink
источник
5
Извините, но я думаю, что вы неправильно истолковали вопрос: has () API сообщает следующее: Сократите набор совпадающих элементов до тех, у которых есть потомок, который соответствует селектору или элементу DOM. OP спрашивает, как проверить, имеет ли элемент с классом myDiv также идентификатор foo, а has () будет искать потомков myDiv с идентификатором foo.
Tilt
7

Допустим, вы просматриваете некоторые объекты DOM и хотите найти и поймать элемент с определенным идентификатором.

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

Вы можете написать что-нибудь вроде найти

$('#myDiv').find('#bar')

Обратите внимание, что если вы использовали селектор классов, метод find вернет все совпадающие элементы.

или вы можете написать итеративную функцию, которая будет выполнять более сложную работу

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

Тот же код можно легко изменить для селектора классов.

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

Я рад, что вы решили свою проблему с помощью index (), что когда-либо работает для вас. Я надеюсь, что это поможет другим с той же проблемой. Ура :)

Нима Фолади
источник
4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });
Заостренный
источник
каждый из них не нужен, потому что никогда не будет больше одного #theMysteryId.
prodigitalson
2
Что ж, это избавляет вас от необходимости назначать его переменной, проверять, не является ли длина непустой, а затем продолжить код. Если селектор ничего не соответствует, jQuery просто не будет вызывать функцию "each", так что это красиво и чисто. Теперь, если все, что вам нужно сделать, это вызвать какой-нибудь jQuery API, тогда обязательно.
Pointy
4

Просто хочу сказать, что в конце концов я решил эту проблему с помощью index ().

НИЧЕГО больше не работало.

Таким образом, для элементов-братьев это хорошая работа, если вы сначала выбираете общий класс, а затем хотите изменить что-то по-разному для каждого конкретного.

РЕДАКТИРОВАТЬ: для тех, кто не знает (например, я), index () дает значение индекса для каждого элемента, который соответствует селектору, считая от 0, в зависимости от их порядка в DOM. Пока вы знаете, сколько элементов с class = "foo", вам не нужен идентификатор.

Очевидно, это не всегда помогает, но кому-то это может пригодиться.

Стелла
источник
3

Проверить, существует ли идентификатор элемента

if ($('#id').attr('id') == 'id')
{
  //OK
}

Vi Ant Anh
источник
1

Вы также можете проверить, используется ли элемент id, выполнив следующие действия:

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

Я использую этот метод для глобальных таблиц данных и определенных упорядоченных таблиц данных

пользователь3379167
источник
undefined должно быть в кавычках, чтобы работать как «undefined»
Лео