2011-01-11 2 views
2

У меня есть ситуации, когда элемент содержит n интерактивных ручки и n revealable элементов:Как исключить нежелательных потомков?

<div class="revealer"> 
    <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> 
    </div> 
    </div> 
</div> 

Когда я нажимаю «ручку», он показывает как «раскрывающие» элементы. Это прекрасно работает. Этот фрагмент кода помещается в данный документ везде, где хочет создатель. В том числе ... внутри другой <div class="reveal"></div> элемент. Способность встраивать эти открывающие объекты разумна и полезна в моем случае.

То, что я застрял, - это достойный способ обрабатывать только немедленные элементы <div class="reveal"></div>, а не вложенные (в противном случае щелчок по внешнему ручку выявит вскрытые вскрытия).

Так вот пример структуры:


<div class="revealer"> 
    <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> 
     <script type="text/javascript"> // a setup script which instantiates a Module object for this revealer, which controls all revealing </script> 

    </div> 
    </div> 
</div> 
<script type="text/javascript"> // a setup script, which instantiates a Module object for this revealer, which controls all revealing </script> 

я сильно использовать рамки YUI2.8.2, так что сейчас у меня есть тест на месте, когда вы нажимаете на ручку, чтобы собрать набор своих открывателей и показать их, но исключая вложенные раскрытия, которые должны действовать по их собственному экземпляру модуля, а не родителям ».

Тест Javascript выглядит следующим образом:

// grab all 'reveal' elements to show 
    var reveals = yd.getElementsBy(function(el){ 
      if(yd.hasClass(el, REVEAL_CLASS) && pObj.isChild(el)){ 
       return true ; 
      } 
      return false; 
    }, null, this.root()); 


    // the test method above is "isChild(el)", the 'el' arg is a 'handle' inside a 'hotspot', so I have... 

isChild: function(el) 
{ 
    var ancestor = yd.getAncestorBy(el, function(nestedEl){ 
     return yd.hasClass(nestedEl, REVEALER_CLASS); 
    }); 

    // ancestor is the immediate parent 'reveal' element 
    var forefather = yd.getAncestorBy(ancestor, function(nestedEl){ 
     return yd.hasClass(nestedEl, REVEALER_CLASS); 
    }); 

    // forefather is 
    if(forefather){ 
     // Yuck yuck yuck, get rid of this dependency on a custom className :(
     if(!yd.hasClass(this.getRoot(), 'revealer-nested')){ 
      return false ; 
     } 
    } 
    return true ; 
}, 

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

... Я надеюсь, что это не tmi, пожалуйста, задайте любые требуемые вопросы и т. Д. Для получения дополнительной информации. Возможно, я пропустил какую-то контекстуальную информацию, поскольку я прав в середине рефакторинга этого модуля.

Многие, большое спасибо заранее.

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

+0

Hrm, окраска кода для меня не совсем корректна, и я не вижу ошибок разметки - но я набирал этот сокращенный кусок HTML вручную - отдыхал заверил, что это действительно код в моей ситуации. – danjah

+0

Возможно, я понял это неправильно, но вам нужно показать только объекты раскрытия, которые находятся на одном уровне (таким образом, братья и сестры) как (из) 'handle'. Однако я не знаю Юй. –

+0

Вы правы, и я не выразил этого в вопросе, но на самом деле я построил свой модуль таким образом, чтобы выявить элементы и ручки в теории можно было бы сидеть внутри x уровня разметки и по-прежнему правильно ориентироваться. Поэтому я использую YUI для захвата только тех элементов, которые мне нужны, вместо того, чтобы полагаться на расположение узлов, таких как parentNode, nextSibling и т. Д. Я добавлю, что вопрос задает. – danjah

ответ

2

Существует селектор CSS3: not(), который позволяет отфильтровывать элементы из выделения. Я знаю, что JQuery можно выбрать набор элементов по селектору CSS3, например:

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

Я думаю, что будет работать в качестве селектора только выбрать элементы класса «открывателя», которые не являются потомками класса «открывателя» ,

Это зависит от того, насколько YUI может поддерживать селектор CSS3 для выбора наборов элементов (если вы определенно используете только YUI).

Помогло ли это? Я думаю, это то, о чем вы спрашивали ...

+0

Ооооо, мой плохой, это будет работать в IE6? (lol, cry, * bang *). На самом деле, одна из причин, по которой я даже рефакторинг этого модуля, включает в себя наши собственные гораздо меньшие размеры виджетов, которые используют только базовую структуру YUI - с явной целью сокращения HTTP-запросов (возможно, использование YUI combo btw). Я объединяю 4 модуля в один, чтобы добиться этого, поэтому добавление другой зависимости lib (jquery/other) не самый лучший вариант ... но я полагаю, что это может произойти, если ничего уже не работает. Заметьте, мне не обязательно нужен код YUI в качестве ответа, просто общая логика будет делать, и я буду YUI-ise. – danjah

+0

Не отвлекайте вас, да, это теоретически то, что я хочу, до тех пор, пока это будет интенсивно скрещиваться. – danjah

+1

Когда jQuery делает это, на самом деле он не полагается на CSS3 в браузере - он реализует функциональность с помощью JavaScript. С сайта jQuery вся библиотека jQuery совместима с: IE 6.0+, FF 2+, Safari 3.0+, Opera 9.0+, Chrome. Кроме того, YUI, вероятно, имеет селектор CSS3, встроенный где-то ... но я не уверен в совместимости с браузером YUI, поскольку я никогда не использовал его. –

Смежные вопросы