Ответ 1
Вы можете использовать .parents()
с селектором eq
. оба родителя и селектор эквалайзера добавлены в версии 1.0:
$('.navPanel').find('img').parents('td').eq(0).hide();
Я работаю над приложением, в котором установлен только jQuery 1.1, который не поддерживает метод .closest.
Теперь мой script выглядит следующим образом:
$('.navPanel').find('img').closest('td').hide();
Итак, я ищу каждое изображение в .navPanel и обследую DOM и скрываю td, в котором он сидит. Кто-нибудь знает, есть ли функция ванильного JavaScript, которую я мог бы просто добавить в свой script, который полиполняет отсутствующий метод .closest?
Спасибо за ваше время.
Вы можете использовать .parents()
с селектором eq
. оба родителя и селектор эквалайзера добавлены в версии 1.0:
$('.navPanel').find('img').parents('td').eq(0).hide();
У современных браузеров есть метод Element.closest().
Пример:
document.querySelector('.navPanel img').closest('td')
Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
Здесь вы можете проверить, какие браузеры имеют встроенную поддержку: https://caniuse.com/#feat=element-closest
Если в браузере нет поддержки, можно использовать следующий polyfill: https://github.com/jonathantneal/closest
myImage.parentNode;
Как ваниль, как она получается. Удалите это в цикле, пока не нажмете требуемый тип тега:
while(thisTag.parentNode.tagName !== 'TD') // uppercase in HTML, lower in XML
{
thisTag=thisTag.parentNode;
}
Это должно сделать трюк в простых старых js.
Дэнни
Потому что IE по-прежнему не поддерживает element.closest()
самое простое, что нужно сделать - это использовать polyfill.
Включите следующие js это polyfill для closest()
(function (ElementProto) {
if (typeof ElementProto.matches !== 'function') {
ElementProto.matches = ElementProto.msMatchesSelector || ElementProto.mozMatchesSelector || ElementProto.webkitMatchesSelector || function matches(selector) {
var element = this;
var elements = (element.document || element.ownerDocument).querySelectorAll(selector);
var index = 0;
while (elements[index] && elements[index] !== element) {
++index;
}
return Boolean(elements[index]);
};
}
if (typeof ElementProto.closest !== 'function') {
ElementProto.closest = function closest(selector) {
var element = this;
while (element && element.nodeType === 1) {
if (element.matches(selector)) {
return element;
}
element = element.parentNode;
}
return null;
};
}
})(window.Element.prototype);