piątek, 29 kwietnia 2011

Najstarszy niewspólny przodek w jQuery



Tworząc dodatek Torrent Hash2Magnet dla Greasemonkey stanąłem przed potrzebom odnalezienie najstarszego niewspólnego przodka w przypadku wyparsowania kilku elementów z dokumentu.

Problem wygląda następująco. Jest dokument z rozbudowaną hierarchią i głęboko osadzonymi 2 elementami: #a3 i #b3


<html>
 <head></head>
 <body>
  <ul id="r1">
   <li id="r2">
    <ul id="r3">
     <li id="a1">
      <ul id="a2">
       <li id="a3" class="child">
       </li>
      </ul>
     </li>
     <li id="b1">
      <ul id="b2">
       <li id="b3" class="child">
       </li>
      </ul>
     </li>
    </ul>
   </li>
  </ul>
 </body>
</html>

Używając biblioteki jQuery parsuję interesujące mnie elementy z klasą .child chcę znaleźć dla każdego z osobna wspomnianego wcześniej NNP, czyli najstarszego rodzica, który jednocześnie nie jest rodzicem drugiego elementu.

$(function(){
 $('.child')
  .parents()
  .not(
   $('.child')
    .not($(this))
    .parents())
  .last();});

Skrypt najpierw parsuje dokument w poszukiwaniu elementów z klasą .child w obrębie elementu body, następnie pobiera wszystkich przodków, aż do korzenia dokumentu, wyklucza rodziców pozostałych elementów z puli (wszystkie z .child bez this) i wybiera ostatni (najstarszy) element z puli.