2015-02-09 20 views
6

Yalnızca jQuery 1.1'in yüklü olduğu, .closest yöntemini desteklemeyen bir uygulama üzerinde çalışıyorum.Vanilla JavaScript jcuery olmadan önbellek

Benim komut şu anda şöyle görünür: Yani

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

Ben .navPanel her görüntü için arayan ve DOM kadar kateden ve oturur td saklıyorum olup olmadığını bilen var mı. Bir vanilya JavaScript işlevi Ben sadece eksik .closest yöntemi polyfills benim komut dosyasına ekleyebilirsiniz?

Zaman ayırdığınız için teşekkür ederiz.

+0

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

+0

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

+0

Merhaba, .parent() bu sayfalarda bazı sayfalar gibi çalışmayacağını söylemiş olmalı img, td yerine bu öğeyi kaldıracak bir href etiketinin etrafına sarılır. Bu yüzden en yakın td'yi bulmak gerekiyor. –

cevap

-10

eq seçicisi ile .parents()'u kullanabilirsiniz. ebeveynler ve eş seçme hem sürüm 1.0 eklenir: o alır gibi

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

Gerçekten vanilya değil, teknik olarak bu soruya cevap vermiyor. Ama OP'nin onunla mutlu olacağını hayal edebiliyorum. ebeveynler() 'jQuery 1.0'dan edinilebilir. eq() 'sadece 1.1.2 olsa bile. – GolezTrol

+2

@GolezTrol, OP'in istediği şeyi ve istediklerini gerçekleştirmenin en iyi yolu, genellikle iki farklı şeydir. –

+0

@GolezTrol: Vanilla hakkında emin değilim, ancak bu sürüm 1.0'da eklendikleri ve bugüne kadar hiç bir zaman kullanımdan kaldırılmadıkları için tüm jquery sürümleri için hile yapmalıdır. –

22
myImage.parentNode; 

vanilya olarak mı.

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

düz eski js hile yapmak gerekir: Eğer gerekli etiket türünü çarpana kadar bir döngü içinde olduğunu Patlat.

Danny

+0

Tabii ki bu, eğer onu bulamazsanız ve 'belgeye' ulaşırsa o zaman sersemlemiş olur. :) – Xotic750

+1

@ Xotic750 - Çok doğru, korkunç yollarla ölür, ancak bu javascript;) – allnodcoms

+2

Ardından, süre html etiketine bastığında bir denetleyici ekleyin ve ardından döngüden çıkın –

3

Nedeni IE hala element.closest()'u desteklemiyor en basit şey bir polyfill kullanmaktır.

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

(bu yakın için() polyfill olan) ve daha sonra bunu anlayacak sadece IE gibi ve tüm diğer değişiklikleri ile çalışır dahil edin.

from jonathantneal/closest

İlgili konular