代码之家  ›  专栏  ›  技术社区  ›  Zack The Human Kunal

原型:选择可见子代的奇数子集

  •  1
  • Zack The Human Kunal  · 技术社区  · 16 年前

    这与我的 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 回复  |  直到 14 年前
        1
  •  1
  •   hobodave    16 年前

    对于您想要的应用程序,css select无法正常工作,它无法在dom上下文之外的数组上正常工作。

    您可以这样做:

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

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

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