2015-02-09 85 views
6

我正在研究只安装jQuery 1.1的应用程序,它不支持.closest方法。Vanilla JavaScript .closest without jQuery

我的剧本目前看起来是这样的:

$('.navPanel').find('img').closest('td').hide(); 

所以我期待在.navPanel每个图像和向上遍历DOM和隐藏,它坐落在TD有谁知道是否有。一个香草JavaScript函数,我可以简单地添加到我的脚本,填充缺少的.closest方法?

谢谢你的时间。

+0

['。家长()'](http://api.jquery.com/parents/)? – 2015-02-09 09:29:07

+0

http://stackoverflow.com/questions/15329167/closest-ancestor-matching-selector-using-native-dom – BeNdErR 2015-02-09 09:29:23

+0

嗨,应该说,.parent()不会在这个实例中工作,因为一些页面, img在它周围封装了一个href标签,它将删除这个元素而不是td。所以它真的需要找到最接近的td – 2015-02-09 09:31:04

回答

-10

您可以使用.parents()eq选择器。父母和EQ选择无论是在1.0版本中加入:

$('.navPanel').find('img').parents('td').eq(0).hide(); 
+4

不是真的香草,所以在技术上它不回答这个问题。但我可以想像OP会对此感到满意。 'parents()'可以从jQuery 1.0中获得。 'eq()'只能从1.1.2开始。 – GolezTrol 2015-02-09 09:30:58

+2

@GolezTrol OP要求的是什么,实现他们想要的最好的方式往往是完全不同的两件事情。 – 2015-02-09 09:33:38

+0

@GolezTrol:我不确定香草,但是这应该对所有jquery版本都有效,因为它们已经在版本1.0中添加了,并且从此不再被弃用。 – 2015-02-09 09:33:41

22
myImage.parentNode; 

是因为香草,因为它得到。重击,在一个循环中,直到你点击所需的标签类型:

while(thisTag.parentNode.tagName !== 'TD') // uppercase in HTML, lower in XML 
    { 
    thisTag=thisTag.parentNode; 
    } 

这应该在普通的老js中做到这一点。

丹尼

+0

当然,这有一个问题,如果你没有找到它,并得到“文件”,那么它会失败。 :) – Xotic750 2015-02-09 09:58:15

+1

@ Xotic750 - 非常真实的,它会死在可怕的方式,但这是JavaScript;) – allnodcoms 2015-02-09 10:07:45

+2

然后只需添加一个检查器,如果while已经击中html标签,然后跳出循环 – 2015-06-03 07:26:11

3

原因IE仍然不支持element.closest()最简单的做法是使用polyfill。

包括this js(这是填充工具对最近())

(function (ElementProto) { 
 
\t if (typeof ElementProto.matches !== 'function') { 
 
\t \t ElementProto.matches = ElementProto.msMatchesSelector || ElementProto.mozMatchesSelector || ElementProto.webkitMatchesSelector || function matches(selector) { 
 
\t \t \t var element = this; 
 
\t \t \t var elements = (element.document || element.ownerDocument).querySelectorAll(selector); 
 
\t \t \t var index = 0; 
 

 
\t \t \t while (elements[index] && elements[index] !== element) { 
 
\t \t \t \t ++index; 
 
\t \t \t } 
 

 
\t \t \t return Boolean(elements[index]); 
 
\t \t }; 
 
\t } 
 

 
\t if (typeof ElementProto.closest !== 'function') { 
 
\t \t ElementProto.closest = function closest(selector) { 
 
\t \t \t var element = this; 
 

 
\t \t \t while (element && element.nodeType === 1) { 
 
\t \t \t \t if (element.matches(selector)) { 
 
\t \t \t \t \t return element; 
 
\t \t \t \t } 
 

 
\t \t \t \t element = element.parentNode; 
 
\t \t \t } 
 

 
\t \t \t return null; 
 
\t \t }; 
 
\t } 
 
})(window.Element.prototype);

,然后它就像IE浏览器可以理解它,它的工作原理与所有没有其他变化。

from jonathantneal/closest