jQuery Визначте, чи має відповідний клас заданий ідентифікатор


95

Що таке jQuery має ідентифікатор ідентифікатора наступного твердження?

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

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

щось на зразок:

$('.mydiv').hasId('foo')

Я хочу застосувати стиль до певного div. Наприклад, під час завантаження будуть показані всі з класом foo, але я можу захотіти вимкнути один екземпляр класу foo, який має ідентифікатор бар.
Ніколас Мюррей,

1
Тоді ви просто зробите, що у $('#bar.foo').toggle();вас буде коли-небудь один ідентифікатор, оскільки вони НЕОБХІДНІ, щоб бути унікальними для документа. якщо ви мусите перемикати цей ідентифікатор, лише якщо він класу, fooпросто додайте клас до селектора ідентифікатора. якщо селектор знаходить порожній набір, нічого не трапиться, якщо він знайде набір з результатами (яких буде лише один), тоді він перемкне елемент. я думаю, ти занадто це думаєш.
вундеркіндлі

3
просто сказати, що це засмучує людей, які кажуть: "чому ти коли-небудь хотів би це зробити?" коли я намагаюся зробити це прямо зараз. Проблема hasClass полягає в тому, що він повертає значення True, якщо БУДЬ-який елемент, який відповідає селектору, має даний клас. Отже, там, де у мене багато p з класом "торт" та додатковими назвами класів для кожного ("один", "два" тощо), у мене виникає проблема. Я хочу вибрати загальний набір p.cake, а потім мати умовний (якщо клас = "один" - $ 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 з невідомими атрибутами. У цьому випадку $ ('ваша відповідь'). Є ('корисно');
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>


5
Вибачте, але я думаю, що ви неправильно витлумачили питання: has () API повідомляє про це: Зменшіть набір відповідних елементів до тих, що мають нащадок, який відповідає елементу селектора або DOM. OP запитує, як перевірити, чи має елемент з класом 'myDiv' також Id foo, а has () шукатиме нащадків 'myDiv', що мають Id 'foo'.
Нахил

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.
вундеркіндлі

2
Ну, це економить вам проблеми із присвоєнням змінної, перевіркою, чи не порожня довжина, а потім продовження роботи з кодом. Якщо селектор нічого не збігається, jQuery просто не буде викликати функцію "кожний", тому він приємний і чистий. Тепер, якщо все, що ви хочете зробити, це викликати якийсь jQuery API, тоді це точно.
Пойнті

4

Просто сказати, що я врешті вирішив це за допомогою index ().

Здавалося б, НІЩЕ ще не працювало.

Отже, для елементів братів або сестер це хороша робота, якщо ви спочатку вибираєте загальним класом, а потім хочете змінити щось по-різному для кожного конкретного.

EDIT: для тих, хто не знає (як я) index () дає значення індексу для кожного елемента, що відповідає селектору, від 0, залежно від їх порядку в DOM. Поки ви знаєте, скільки елементів існує з class = "foo", вам не потрібен ідентифікатор.

Очевидно, це не завжди допоможе, але хтось може виявити це корисним.



1

Ви також можете перевірити, чи використовується елемент id, виконавши це:

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

Я використовую цей метод для глобальних таблиць даних та конкретно впорядкованих таблиць даних


невизначені повинні бути в лапках, щоб працювати так само "невизначено"
Лев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.