JQuery знайде перший батьківський елемент із конкретним префіксом класу


124

Я хочу отримати першого з батьків, який має специфічний префікс класу, припустимо:

<div class="div-a3332"> 
  <div class="div-a89892">
    <p>
      <div class="div-b2">
        <div id="divid">hi</div>
      </div>
    </p>
  </div>
</div>

Наприклад, мій поточний елемент є, #dividі я хочу знайти перший елемент, який має префікс класу div-a. Тому в основному він вибере:

<div class="div-a89892">

6
Стій. Використовуйте кілька класів замість того, щоб комбінувати інформацію в один клас. Селектор "узгодження" повільний, і ця конструкція не масштабує жодних модифікацій. <div class='a'>, то надайте правила для div.a. Я не знаю, чому ви взагалі вводите divім'я класу.
Стефан Кендалл

2
Проте не зливайте дані в префікси класу. Це жахливий зразок, і його легко виправити за допомогою декількох класів.
Стефан Кендалл

17
@StefanKendall: Іноді ти маєш справу з сторонніми лайнами інших людей, а іноді ти підтримуєш застарілі програми, які не вдається швидко виправити. Поганий дизайн - це факт життя, і це цілком законне питання.
Nerdmaster

Відповіді:


222

Використовувати .closest()з селектором:

var $div = $('#divid').closest('div[class^="div-a"]');

До речі, не знаю, чому це було знято. Селектор класу префікса крихкий, але це буде працювати.
Метт Бал

ДО ОП: Переконайтеся, що шуканий елемент - це батько десь на дереві DOM, а не рідний брат або схожий на потрібний об'єкт (згідно документації). Це не "найближче місце в документі", але "найближче, опрацювавши дерево DOM".
Крістіан П.

Не працює для мене. Також я хочу знайти перший елемент, який має специфічний префікс, який не повинен бути елементом div.
подорож у часі

@Time потім видалити divселектор елемента: $('#divid').closest('[class^="div-a"]'). Як прокоментував @Stefan, ви дійсно повинні використовувати кілька класів.
Метт Бал

3
Цей селектор займає абсурдну кількість циклів (але це все ще може бути швидким). Якщо вам потрібно підтримувати IE6, IE7 або IE8, це може насправді зіпсувати вас, якщо ваш DOM зростає занадто великим; IE виводить діалог "скрипт не відповідає", коли виконується певна кількість інструкцій JS VM, а НЕ через певний проміжок часу. Я бачив сценарії, які завершуються через 0,1 мс краху Internet Explorer саме з цієї причини.
Стефан Кендалл

56

Пізніше Jquery дозволив вам знайти батьків .parents()методом.

Тому рекомендую використовувати:

var $div = $('#divid').parents('div[class^="div-a"]');

Це дає всі батьківські вузли, що відповідають селектору. Для отримання першого з батьків, що відповідає селектору, використовуйте:

var $div = $('#divid').parents('div[class^="div-a"]').eq(0);

Для інших таких запитів обходу DOM ознайомтеся з документацією про обхід DOM .


Відповідь не вводить в оману, вона лише демонструє іншу альтернативу .closest (), .parents () виглядає читабельніше і є іншим рішенням проблеми.
Сонячний Р Гупта

9
Найближче - це краще рішення, ніж це, оскільки найближчі знайдуть перший матч, тоді як батьки знайдуть ВСІ матчі, що піднімаються до DOM. Очевидно ефективніше використовувати найближчі, хоча я згоден, це не найкраще названа функція.
Mog0

1
Досить смішно, я в кінцевому підсумку використовував це рішення, оскільки .parentsUtil () не працював, як я очікував.
Марк Хенді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.