2013-07-15 1 views
0

У меня возникает небольшая путаница в отношении того, как точно работают селекторы в Javascript/jQuery. У меня есть два метода, называемые почти одинаковыми способами, которые, кажется, возвращают разные селекторы, и я не могу сказать, почему.Разница между методами доступа к узлу в Javascript/jQuery

if (document.URL.indexOf("search?s=") !== -1){ 
    updateOldSearch(); 
} else { 
    $("li a:contains('Search')").bind("click", replaceWithSearch); 
} 

Все отлично работает в другое заявление здесь:

function replaceWithSearch(){ 
    this.parentNode.replaceChild(searchWrapper, this); //Works fine 
} 

Но когда я к нему доступ в то, что мне кажется, чтобы быть идентичным образом (ясно, что это на самом деле не идентичны) она нарушает

function updateOldSearch(){ 
    var courseTab = $("li a:contains('Search')"); 
    courseTab.parentNode.replaceChild(newBox, courseTab); //parentNode is undefined 
} 

Любые объяснения относительно того, что происходит за кулисами здесь? Есть ли автоматическое кастинг, который jQuery делает, что я злоупотребляю?

+0

'$()' возвращает объект JQuery, а не DOM Node. Две очень разные вещи. объект jQuery не имеет всех тех же методов, что и узел DOM. –

+0

@KevinB - объекты jQuery, автоматически передаваемые в узлы DOM, когда они передаются в обратный вызов? –

+0

Это зависит от обратного вызова, но обычно да. –

ответ

3

В первом примере this представляет собой собственный узел DOM. Во втором случае courseTab представляет объект jQuery.

Попробуйте для второго примера:

function updateOldSearch(){ 
    var courseTab = $("li a:contains('Search')").get(0); 
    courseTab.parentNode.replaceChild(newBox, courseTab); 
} 
+0

Прохладный, рад узнать больше об этих полезных тонкостях. –

2

Есть некоторые автоматические отливка, что JQuery делает?

Kinda. Ваш прослушиватель событий работает, потому что jQuery calls it so that «это ключевое слово - ссылка на элемент, в котором доставляется событие». Обратите внимание на «элемент», а не на «коллекцию jQuery».

В отличие от этого переменная courseTab содержит экземпляр jQuery (вместо простого узла DOM). Используйте

$("li a:contains('Search')").each(function() { 
    this.parentNode.replaceChild(newBox, this); 
}); 

или

$("li a:contains('Search')").replaceWith(newBox);