PrototypeJS:选择可见子项的奇数子集

时间:2009-07-17 00:27:47

标签: javascript css-selectors prototypejs

这与我的previous question about selecting visible elements有关。现在,这就是扭曲:让我们说我只想从一个元素的可见子集中选择奇数子元素。最好的方法是什么?

编辑:这是我的输入和预期输出的示例。

<!-- 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>
我提出了两种方法。一个有效,但另一个无效。

// 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");

我现在正在做的是以下内容:

// 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");    
    });

这段代码似乎可以改进。任何人都可以建议一个更好的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

CSS select不适用于您想要的应用程序,它在DOM上下文之外的数组上无法正常工作。

您可以按照以下方式执行此操作:

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

答案 1 :(得分:0)

你不能合并这两个条件吗?

var listChildren = $$("ul.stripe > li");
var oddChildren = allChildren
  .findAll(function(el) { return el.visible() && el.match("li:nth-child(odd)"); })
oddChildren.invoke("addClassName", "odd");