Что такое селектор jquery для исключения вложенных потомков? - PullRequest
1 голос
/ 12 января 2011

В соответствии с моим SO вопросом здесь , который превратился в jquery, чтобы решить эту проблему, но который может быть возвращен в YUI, если я правильно соображаю, мне нужен селектор для исключения потомков.

Предлагаемое решение говорит что-то вроде этого:

$( '.revealer:not(.revealer > .revealer)' );

Чтобы более точно соответствовать моей ситуации, поскольку у меня есть несколько фрагментов HTML для выполнения одного и того же теста, я обновил его следующим образом:

$( '#_revealerEl_0 .handle:not(#_revealerEl_0 .reveal .handle)' );

HTML-код, который он выбирает (на рисунке есть многочисленные копии одного и того же фрагмента на странице, каждый из которых должен обрабатываться отдельно - атрибут id назначается каждому «открывателю»):

<div class="revealer" id="#_revealerEl_0">
  <div class="hotspot">
    <a class="handle" href="javascript:;">A</a>
    <div class="reveal">
      <p>Content A.</p>
    </div>
    <div class="reveal">

        <p>Content B.</p>

        <!-- nested revealer -->
        <div class="revealer">
          <div class="hotspot">
            <a class="handle" href="javascript:;">A</a>
            <div class="reveal">
              <p>Sub-content A.</p>
            </div>
            <div class="reveal">
              <p>Sub-content B.</p>
            </div>
          </div>
        </div>

    </div>
  </div>
</div>

В двух словах: мне нужно нацелить дескрипторы «верхнего уровня» в пределах «горячей точки» для каждого открывателя, а не на вложенных потомков с одинаковыми именами классов.

спасибо, д

EDIT:

Также очень важно, чтобы я не начинал полагаться на свойства-потомки, такие как parentNode, childNode [x], nextSibling и т. Д., Потому что в настоящее время этот модуль достаточно гибок в том смысле, что его элементы «раскрыть» и «обрабатывать» могут находиться в другой разметке и по-прежнему быть целью - до тех пор, пока они находятся внутри «горячей точки».

Ответы [ 3 ]

0 голосов
/ 12 января 2011

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

         obj = $('.revealer[id*="revealerEl"]');
    //this will give you what you are after
     result = $("> .hotspot > .handle",obj)

    //if you want to see them in red
         $("> .hotspot > .handle",obj).css('color','red');

//or assign a click to it
 $("> .hotspot > .handle",obj).click(function(){
//blah ....
})
0 голосов
/ 12 января 2011

Это работает для меня, используя jQuery:

$('.revealer:first > .hotspot > .reveal')

По первому открывателю найдите все горячие точки, которые являются ПРЯМЫМИ дочерними элементами, и найдите любые ПРЯМЫЕ раскрываемые элементы в пределах.обработчики для ваших «дескрипторов»:

$('.handle').click(function(){
    $(this).closest('.hotspot > .reveal').show();
});

Выше приведено:

  • Для любого данного дескриптора назначьте функцию события щелчка элементу
  • нажата ручка, найдите ближайшую родительскую точку доступа
  • В точке поиска найдите все элементы раскрытия, которые являются прямыми потомками точки доступа
  • Отображение этих элементов, если они были скрыты, с отображением: нет.
0 голосов
/ 12 января 2011

Я не знаю, какой ваш #_revealerEl_0 элемент, но если это ваш верхний уровень .revealer, разве вы не можете просто сделать это?

$('#_revealerEl_0 > .hotspot > .handle')

Или если верхний уровень.revealer сам является потомком #_revealerEl_0, тогда это работает:

$('#_revealerEl_0 > .revealer > .hotspot > .handle')

Основная предпосылка здесь состоит в том, что вы объединяете несколько > дочерних комбинаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...