Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用JQuery选择器在DOM中以前出现的元素_Javascript_Jquery - Fatal编程技术网

Javascript 使用JQuery选择器在DOM中以前出现的元素

Javascript 使用JQuery选择器在DOM中以前出现的元素,javascript,jquery,Javascript,Jquery,我想知道如何从元素中获取之前出现的选择器,而不管它在DOM树中的什么位置。我假设前面的事件不是我的原始元素的子元素之一 例如: <body> <p class="somethingImportant">Important</p> <h1> <p class="somethingImportant">Important too!</p> </h1> <tabl

我想知道如何从元素中获取之前出现的选择器,而不管它在DOM树中的什么位置。我假设前面的事件不是我的原始元素的子元素之一

例如:

<body>
    <p class="somethingImportant">Important</p>
    <h1>
        <p class="somethingImportant">Important too!</p>
    </h1>

    <table>
        <tr>
            <td id="start">Starting from here!</td>
        </tr>
    </table>
</body>
我从
`
开始。我想得到与JQuery选择器
p.pageNumber、h1、h2、h3、h4、h5、h6匹配的上一个元素,不管它嵌套在DOM中的什么位置,只要它在突出显示之前。选择器匹配我识别为标题元素的所有元素

在这种情况下,它应该返回
动物种类


代码示例

使用Lee的解决方案,我能够构建一个函数,它可以很好地完成我想要它完成的工作,但却很优雅

function GetPreviousOccurrence(elemSel, sel) {
    var selector = elemSel + ", " + sel;
    var prev;
    $(selector).each(function() {
        if ($(this).is(elemSel)) {
            return false;
        }
        prev = this;
    });

    return prev;
}
在我的例子中,
elemSel=“#highlight”
sel=“p.pageNumber,h1,h2,h3,h4,h5,h6”它可能不是超级性能,但至少读起来不错


额外注意:Lee的附录更好。

这将得到DOM元素的列表,包括您想要查找的元素和您提到的元素。我假设您将funky
元素更改为
,并且id成为一个类:

var prev;
$(".start, .somethingImportant").each(function () {
    if ($(this).hasClass("start")) {
        return false;
    }
    prev = this;
});

... now '$(prev)' contains the previous elemnent you wanted 
...  or 'undefined' if there are none.
你得到了所有的元素。jQuery是按DOM顺序进行的。遍历,当您找到“start”元素时,前一个元素就是您想要的

请注意,在您的示例中,这是可行的,因为在start元素之后没有“重要”元素:

$(".somethingImportant:last")
附录

我的另一个想法是基于OP的解函数

// Call this way
var $prev = GetPreviousOccurrence($("#highlight"), $("p.pageNumber, h1, h2, h3, h4, h5 , h6"));


function GetPreviousOccurrence($elemSel, $sel) {
    var selector = $elemSel.add($sel);
    var $prev;
    $(selector).each(function() {
        if ($(this).is($elemSel)) {
            return false;
        }
        $prev = $(this);
    });

    return $prev;
}

您给出的示例很糟糕,ID必须是唯一的,并且您的p标记未关闭。在
中包含
也是无效的。浏览器会把它扔掉。我会先让你的ID独一无二……不,一点也不现实。让它代表实际问题。我得说我经常看到这些父母/兄弟姐妹的问题。我总是感到困惑,为什么解决方案不仅仅是向要检索的特定元素添加一个类(或ID),然后引用这些元素。这是一个更具可扩展性的解决方案,实际上非常酷。我会试试看,看看效果如何。我想我以前因为遗漏了一些家长而被否决了。当问题是“如何”时,代码(即使没有parens)也会告诉“如何”时,这似乎很愚蠢。啊,就是这样。是为了“怎么做”。不管怎样,你是个救生员。我将发布我正在使用的函数,它概括了您的建议。
// Call this way
var $prev = GetPreviousOccurrence($("#highlight"), $("p.pageNumber, h1, h2, h3, h4, h5 , h6"));


function GetPreviousOccurrence($elemSel, $sel) {
    var selector = $elemSel.add($sel);
    var $prev;
    $(selector).each(function() {
        if ($(this).is($elemSel)) {
            return false;
        }
        $prev = $(this);
    });

    return $prev;
}