【问题标题】:jquery selecting certain 'level' of elements?jquery选择某些“级别”的元素?
【发布时间】:2015-06-10 21:59:31
【问题描述】:

假设我有以下标记:

<div>
    <h3><a href="">link I want to select</a></h3>
        <div>
             <h3><a href="">link</a></h3>
        </div>
    <h3><a href="">link I want to select</a></h3>
    <h3><a href="">link I want to select</a></h3>
    <a href="">link</a>
</div>

假设以下...

  • 我要查找的元素都在同一层嵌套
  • 我可能不知道具体的嵌套元素是什么(所以不能使用具体的选择器)

...有没有一种聪明的方法来选择“第一个锚标记,以及嵌套在同一级别的所有其他锚标记”,以便它返回第 1、第 3 和第 4 个链接?

更糟糕的情况是,我们需要进入并在我们的 HTML 中添加特定的类,但如果这可以通过纯选择器来完成,那就太好了。

【问题讨论】:

    标签: jquery css-selectors


    【解决方案1】:

    不是纯粹的选择器,但是怎么样:

    var depth = $('#myanchor').parents().length;
    var all_at_depth = $("a").filter( function() { $(this).parents().length == depth; } );
    

    如果有帮助,您可以使用 parentsUntil() 来获取 #myanchor 和特定父级之间的距离。

    【讨论】:

    • 我认为这确实有帮助!聪明的解决方案!
    • 我不认为这真的有效,请参阅此处的 jsFiddle:jsfiddle.net/tchalvakspam/2ejudrqz/3 但无论如何,它似乎依赖于在一个嵌套级别没有 5 个父元素,并且在一个嵌套级别也没有 5 个父元素不同的嵌套级别。
    • @Kzqai OP明确声明所有元素都处于同一嵌套级别。
    • 你是对的,我把.parents() 误认为.parent(),所以我错了。有一个赏金。
    【解决方案2】:

    查看siblings():first

    【讨论】:

    【解决方案3】:
    $('a:first').parent().siblings().children('a');
    

    【讨论】:

    • 如果我知道第一个锚点只嵌套了一个元素就可以了。
    • 问题是,他想跨父元素工作吗?如果没有,这将起作用。如果他在这个例子中有其他的div &gt; h3 &gt; a 并且想要选择那些a,这将不起作用。
    • 另外,如果第一个a正好在他的目标div之下,这将突破那个div返回其他东西。
    • @DA,根据您的假设评论做出了该假设。 @Stuart B - 是的,仅基于他的结构
    【解决方案4】:

    this怎么样?

    $(function () {
    // I take it you need some way to get the reference element.
    var referenceElement = $('a').eq(0);
    // Build the selector by making as many child selectors as our nesting level.
    var selector = '';
    var currentElement = referenceElement;
    while (currentElement[0].parentNode !== document.body) {
        selector = (selector ? '* > ' + selector : '*');
        window.console && window.console.debug(currentElement, '!==', document.body, ' => ', currentElement.parent(), '; selector = ', selector);
        currentElement = currentElement.parent();
    }
    // Replace the tagName stuff with '*' if you want any element to match.
    selector = 'body > ' + selector + ' > ' + referenceElement[0].tagName;
    window.console && window.console.log(selector, ' => ', $(selector));
    

    });

    【讨论】:

      【解决方案5】:

      我编写了这个 jQuery 函数,它应该可以完成这项工作。

      示例:https://jsfiddle.net/xvcby8kL/2/

      $.extend({
      
          /**
           * Returns set of same elements on the same DOM depth
           *
           * @param {string} selector of the referencing element
           * @param [{string} parent, body by default]
           * @returns {jQuery} set of elements
           */
          getSameLevelElements: function (selector, parent) {
      
              if (typeof parent === 'undefined') {
                  parent = 'body';
              }
      
              var el = $(selector).first();
      
              if (el.length < 1) {
                  return $();
              }
      
              var depth = el.parents(parent + ' *').length;
      
              for (var i = 0; i < depth; i++) {
                  parent += ' > *';
              }
      
              selector = parent + ' > ' + el.get(0).tagName.toLowerCase();
      
              return $(selector);
      
          }
      
      });
      

      【讨论】:

        【解决方案6】:

        使用属性类

        <div>
            <h3 class="select" ><a href="">link I want to select</a></h3>
                <div>
                     <h3><a href="">link</a></h3>
                </div>
            <h3 class="select" ><a href="">link I want to select</a></h3>
            <h3 class="select" ><a href="">link I want to select</a></h3>
            <a href="">link</a>
        </div>
        

        jquery:

        $(".select").each(function(){
        //functionality
        });
        

        【讨论】:

          【解决方案7】:

          如果要选择一个h3下的所有链接:

          var $links = $('h3 a');
          

          编辑: 抱歉,我显然没有仔细阅读。也许您可以尝试以下方法(注意这未经测试):

          var $links = $(div > * > a);
          

          【讨论】:

          • 对,但这就是我现在所追求的。我试图避免使用特定的选择器,因为我不一定知道元素将嵌套在什么中。
          • 我会说你应该在元素上放置一个类。这是迄今为止解决这个问题的最不脆弱的方法。
          • 我很肯定你是对的。我认为强制更改标记是最好的选择。也就是说,现在我很好奇。所以现在我认为这更像是一个脑筋急转弯而不是有用的代码。 ;o)
          猜你喜欢
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多