2009-07-17 11 views
1

Dies steht in Beziehung zu meiner previous question about selecting visible elements. Nun, hier ist die Wendung: Nehmen wir an, ich möchte nur die ungeraden Kinder aus der Menge der sichtbaren Kinder eines Elements auswählen. Was wäre der beste Weg, dies zu tun?PrototypeJS: Auswählen der ungeraden Untergruppe sichtbarer Kinder

Edit: hier ist ein Beispiel für meine Eingabe und erwartete Ausgabe.

<!-- A list with some visible and invisible children --> 
<ul class="stripe"> 
    <li>Visible 1</li> 
    <li style="display:none;">Visible 2</li> 
    <li style="display:none;">Visible 3</li> 
    <li>Visible 4</li> 
    <li style="display:none;">Visible 5</li> 
    <li>Visible 6</li> 
    <li>Visible 7</li> 
</ul> 

<!-- Only the visible children. --> 
<li>Visible 1</li> 
<li>Visible 4</li> 
<li>Visible 6</li> 
<li>Visible 7</li> 

<!-- The "odd" visible children. --> 
<li>Visible 1</li> 
<li>Visible 6</li> 

Ich kam mit zwei Möglichkeiten. Das eine funktioniert, das andere nicht.

// Method one: Returns the odd children whether they are visible or not. :(
var listChildren = $$("ul.stripe > li"); 
var oddChildren = allChildren 
    .findAll(function(el) { return el.visible(); }) 
    .findAll(function(el) { return el.match("li:nth-child(odd)"); }); 
oddChildren.invoke("addClassName", "odd"); 

Was ich momentan tue, ist nun folgende:

// Method two: grouping! 
var listChildren = $$("ul.stripe > li"); 
var oddChildren = listChildren 
    .findAll(function(el) { return el.visible(); }) 
    .eachSlice(2, function(el) { 
     el[0].addClassName("odd");  
    }); 

Dieser Code scheint, wie es verbessert werden könnte. Kann jemand einen besseren Weg vorschlagen, dies zu erreichen?

Antwort

1

Die CSS-Auswahl funktioniert nicht für die gewünschte Anwendung, sie funktioniert nicht auf einem Array außerhalb des DOM-Kontexts.

Sie können dies wie folgt:

var index = 0; 
var myChildren = $$("ul.stripe > li") 
    .select(function(e) { return e.visible(); }) 
    .select(function(e) {return ++index % 2 == 1; }); 
+0

Dieser Code hat es in die Produktion geschafft! –

+0

Toll Zack zu hören :) – hobodave

0

Können Sie die beiden Bedingungen nicht so zusammenführen?

+0

Ja. Das Problem ist jedoch, dass ich die sichtbaren Elemente zuerst auswählen möchte und dann von * denen * die "ungeraden" Elemente auswähle. Das Problem dabei (egal mit meiner findAll-Version) ist, dass die Elemente "Oddness" außerhalb dieser "sichtbaren" Teilmenge von Kindern getestet werden. –