代码之家  ›  专栏  ›  技术社区  ›  naltatis

使用原型查找元素的特定直接子代

  •  2
  • naltatis  · 技术社区  · 14 年前

    遵循DOM结构:

    <ul>
      <li class="item">yes</li>
      <li>no</li>
      <li class="item">yes</li>
      <li>
        <ul>
          <li class="item">no</li>
        </ul>
      </li>
    </ul>
    

    假设我有外层 <ul> 在里面 $ul . 我怎么得到 两个直系子女 哪有 item 班级?

    JQuery 我会这样写:

    $ul.children().filter(".item")
    $ul.children(".item")
    $ul.find("> .item")
    

    这个怎么办 原型 ?

    我尝试了以下方法…

    $ul.select("> .item") //WRONG
    

    …但它做的恰恰相反,并返回 一内 <li>

    2 回复  |  直到 13 年前
        1
  •  10
  •   Alsciende    14 年前

    虽然原型没有 filter 方法,它还有两个通用方法: findAll grep . 在这里,你可以两者兼用。解释的grep here :

    var items = ul.childElements().grep(new Selector('li.item'));
    

    或findAll:

    var items = ul.childElements().findAll(function (elt) {
      return elt.match('li.item');
    });
    

    下面是一个例子: http://jsfiddle.net/RuBzq/ .

    你所尝试的( ul.select("> .item") )不起作用,因为选择器只测试 ul . 自从 UL 选择器未知, > 不是从 UL 但从它下面的元素。所以一切都是 的直系后代 UL 将匹配 ul.select('> *') 例如。这就是为什么 ul.select('> .item') 只有匹配 .items 是某事物的后代 套内 . 如果jquery的工作方式不同,那就是一个麻烦。

        2
  •  1
  •   Matthew Smith    14 年前

    如果您的保险商实验室有foo的ID,您可以这样做:

    var els = $$('#foo>.item').each(function(s,i) { alert(s.innerText); });
    

    奇怪的是,这些都不起作用。

    $('foo').getElementsBySelector('>.item').each(function(s,i) { alert(s.innerText); });
    // As you say it returns the 'no' list item. Taking off the '>' doesn't work either.
    
    $('foo').getElementsBySelector('.item').each(function(s,i) { alert(s.innerText); });
    // returns all three
    
    $('foo').up().getElementsBySelector('>.item').each(function(s,i) { alert(s.innerText); });
    // returns all three
    

    getElementsBySelector 应该等于 $$() 但显然不是。在我看来像是一个原型中的错误…

    这是可行的,但似乎没有什么价值…

    $('foo').up().getElementsBySelector('#foo>.item').each(function(s,i) { alert(s.innerText); });