2016-07-19 7 views
1

Извинения для такого рода вопрос, но я не могу найти ответ на You Might Not Need jQuery или в другом месте в Интернете, и я бы очень хотел знать:Что такое чистый JavaScript-эквивалент jQuery's .parents()?

Что такое чистый JavaScript эквивалент .parents JQuery в() метод ?

Например, было бы здорово, чтобы узнать, как сделать это в чистом JavaScript:

jQuery(element).parents('.className'); 
+2

* «Что такое чистый JavaScript-эквивалент метода .parents() jQuery?» * Нет. Вы имеете в виду «Что такое DOM API-версия метода' parent() 'jQuery? –

+5

'while ((element = element.parentElement)) {if (element.matches ('. ClassName')) {result.push (element)}}' –

+0

Я был уверен, что это дубликат, но я не могу найти Это. – Bergi

ответ

4

Там не одна функция/свойство в API DOM, который приравнивает к JQuery-х parents(). Существует свойство parentNode (и как Oriol points out, свойство parentElement, которое предотвратит ваш переход от до document), который является родительским узлом (или родительским элементом) элемента, к которому вы обращаетесь к нему, или null, если он не работает У меня есть. Чтобы приблизительно соответствовать parents() jQuery, вы можете на него направить (например, получить parentNode/parentElement из parentNode/parentElement и т. Д.), Чтобы найти всех родителей. Как squint notes, на неопределенно современных браузерах на каждом уровне вы можете использовать matches, чтобы проверить, соответствует ли родительский селектор (чтобы соответствовать поведению jQuery с parents(), когда вы передаете ему селектор).

jQuery использует основанный на наборах подход к манипулированию и обходу DOM, тогда как DOM API использует подход для каждого элемента/узла.

Пример:

var elm = document.getElementById("target"); 
 
var parents = getParents(elm); 
 
console.log(Array.prototype.map.call(
 
    parents, 
 
    function(e) { 
 
    return e.nodeName + (e.id ? "#" + e.id : ""); 
 
    } 
 
).join(", ")); 
 
function getParents(e) { 
 
    var result = []; 
 
    for (var p = e && e.parentElement; p; p = p.parentElement) { 
 
    result.push(p); 
 
    } 
 
    return result; 
 
}
<div id="outermost"> 
 
    <div id="middle"> 
 
    <div id="inner"> 
 
     <div id="target"></div> 
 
    </div> 
 
    </div> 
 
</div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+1

Используйте 'parentElement' вместо' parentNode', чтобы избежать 'document'. – Oriol

+0

@Oriol: для этого нужны более современные браузеры, чем 'match' /' matchesSelector', хотя – Bergi

+0

*** sigh *** И нижний нисходящий (здесь и одновременно один на ответ SpeedyNinja) - это потому, что ...? –

2

Node.parentNode

Когда вы получите HTML с помощью какой-то метод (document.getElementById(), document.querySelector() и т.д.) он будет возвращать объект Node, то .parentNode свойство объекта является материнским объектом Node


Чтобы получить все родительские узлы, сродни JQuery-х .parents():

Я написал эту функцию некоторое время назад:

function parents(node) { 
    let current = node, 
     list = []; 
    while(current.parentNode != null && current.parentNode != document.documentElement) { 
    list.push(current.parentNode); 
    current = current.parentNode; 
    } 
    return list 
} 

Пожалуйста, обратите внимание, что это только слегка испытано, так возьмите его с зерном соль

+0

Не совсем то же самое, хотя вы можете рекурсивно пересекать DOM назад, используя свойство .parentNode, чтобы достичь аналогичной функциональности с помощью метода jpari .parents(). Но это требует написания кода. – HaukurHaf

+0

Я, конечно, не мог бы сфокусироваться на этом. –

+1

@ T.J.Crowder Согласен. Сменил нижний предел, суровый :-) – HaukurHaf