2015-02-09 18 views
6

Sto lavorando a un'applicazione che ha solo jQuery 1.1 installato che non supporta il metodo .closest.Vanilla JavaScript .closest senza jQuery

Il mio script attualmente si presenta così:

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

Così sto cercando per ogni immagine nel .navPanel e attraversare il DOM e nascondendo il TD che si siede in Qualcuno sa se c'è. una funzione JavaScript vaniglia Potrei semplicemente aggiungere al mio script che il poliffo è il metodo più mancante?

Grazie per il vostro tempo.

+0

[ '.parents()'] (http://api.jquery.com/parents/)? –

+0

http://stackoverflow.com/questions/15329167/closest-ancestor-matching-selector-using-native-dom – BeNdErR

+0

Ciao, avrei dovuto dire che .parent() non funzionerà in questo caso come alcune delle pagine, il img ha un tag href attorno ad esso che rimuoverà questo elemento piuttosto che il td. Quindi ha davvero bisogno di trovare il più vicino td –

risposta

-10

È possibile utilizzare con il selettore eq. entrambi i genitori e la selezione della eq vengono aggiunte nella versione 1.0:

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

Non proprio vaniglia, quindi tecnicamente non risponde alla domanda. Ma posso immaginare che l'OP ne sarà felice. 'parents()' è disponibile da jQuery 1.0. 'eq()' solo da 1.1.2, comunque. – GolezTrol

+2

@GolezTrol ciò che l'OP chiede e il modo migliore per ottenere ciò che vogliono sono due cose completamente diverse. –

+0

@GolezTrol: non sono sicuro di vanilla, ma questo dovrebbe fare il trucco per tutte le versioni jquery in quanto sono state aggiunte nella versione 1.0 e non sono mai state deprecate da allora. –

22
myImage.parentNode; 

è tanto di vaniglia, come si arriva. Whack che in un ciclo fino a colpire il tipo di tag obbligatorio:

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

Questo dovrebbe fare il trucco in vecchi js pianura.

Danny

+0

Ovviamente questo ha il problema che se non lo trovi e arrivi a 'document' allora si romperà. :) – Xotic750

+1

@ Xotic750 - Molto vero, sarebbe morto in modi orribili, ma questo è javascript;) – allnodcoms

+2

Quindi basta aggiungere un correttore se nel frattempo ha colpito il tag html quindi uscire dal ciclo –

3

Causa IE ancora non supporta element.closest() la cosa più semplice da fare è utilizzare un polyfill.

Includere this js (questa è la polyfill per più vicino())

(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);

e poi è proprio come IE avrebbe capirlo e funziona tutto senza altre modifiche.

from jonathantneal/closest

Problemi correlati