找到最接近的前一个元素jQuery

Pet*_*son 37 jquery

我想要类似于这个人的东西,除了我想要匹配的元素可能不是直接的兄弟.

例如,如果我有这个HTML,

<h3>
    <span>
        <b>Whaddup?</b>
    </span>
</h3>
<h3>
    <span>
        <b>Hello</b>
    </span>
</h3>
<div>
    <div>
        <img />
    </div>
     <span id="me"></span>
</div>
<h3>
    <span>
        <b>Goodbye</b>
    </span>
</h3>
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

var link = $("#me").closestPreviousElement("h3 span b");
console.log(link.text()); //"Hello"
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法在jQuery中执行此操作?

编辑:我应该让我的规范更清晰一点.$("#me")可能有也可能没有父div.代码不应该假设它确实如此.我不一定了解周围的元素.

use*_*716 55

var link = $("#me").closest(":has(h3 span b)").find('h3 span b');
Run Code Online (Sandbox Code Playgroud)

示例: http ://jsfiddle.net/e27r8/

这使用closest()[docs]方法获得具有嵌套的第一个祖先h3 span b,然后执行a .find().

当然你可以有多个比赛.


否则,您正在寻找更直接的遍历.

var link = $("#me").closest("h3 + div").prev().find('span b');
Run Code Online (Sandbox Code Playgroud)

编辑:这个适用于您更新的HTML.

示例: http ://jsfiddle.net/e27r8/2/


编辑:更新以处理更新的问题.

var link = $("#me").closest("h3 + *").prev().find('span b');
Run Code Online (Sandbox Code Playgroud)

这使得目标元素成为.closest()泛型,因此即使没有父元素,它仍然可以工作.

示例: http ://jsfiddle.net/e27r8/4/


Emi*_*mil 8

http://api.jquery.com/prev/

var link = $("#me").parent("div").prev("h3").find("b");
alert(link.text());
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/gBwLq/


gil*_*ly3 8

不,没有"简单"的方式.你最好的选择是做一个循环,你首先检查每个兄弟姐妹,然后移动到父节点及其所有兄弟姐妹.

您需要将选择器分成两个,1以检查当前节点是否可以是选择器中的顶级节点,以及1以检查它的后代是否匹配.

编辑:这可能也是一个插件.您可以将它与任何HTML中的任何选择器一起使用:

(function($) {
    $.fn.closestPrior = function(selector) {
        selector = selector.replace(/^\s+|\s+$/g, "");
        var combinator = selector.search(/[ +~>]|$/);
        var parent = selector.substr(0, combinator);
        var children = selector.substr(combinator);
        var el = this;
        var match = $();
        while (el.length && !match.length) {
            el = el.prev();
            if (!el.length) {
                var par = el.parent();
                // Don't use the parent - you've already checked all of the previous 
                // elements in this parent, move to its previous sibling, if any.
                while (par.length && !par.prev().length) {
                    par = par.parent();
                }
                el = par.prev();
                if (!el.length) {
                    break;
                }
            }
            if (el.is(parent) && el.find(children).length) {
                match = el.find(children).last();
            }
            else if (el.find(selector).length) {
                match = el.find(selector).last();
            }
        }
        return match;
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)


jgi*_*bbs 8

我知道这是旧的,但是正在寻找同样的东西,最终提出了另一种相当简洁和简单的解决方案.这是我找到下一个或上一个元素的方法,考虑到不属于我们正在寻找的类型的元素的遍历:

var ClosestPrev = $( StartObject ).prevAll( '.selectorClass' ).first();
var ClosestNext = $( StartObject ).nextAll( '.selectorClass' ).first();
Run Code Online (Sandbox Code Playgroud)

我不是100%确定来自nextAll/prevAll函数的集合返回的顺序,但在我的测试用例中,似乎数组是在预期的方向.如果有人能够为可靠性的有力保证澄清jquery的内部结构,那么可能会有所帮助.