2015-08-18 32 views
5

Chcę zaimplementować scrollspy jQuery do jednego z projektów, nad którymi pracuję.

Znalazłem to jsfiddle (https://jsfiddle.net/mekwall/up4nu/), które udało mi się zaimplementować w moim projekcie. Chciałbym go zmodyfikować, ale utknąłem w próbie zrozumienia, co oznacza ten fragment kodu.

var topMenu = $("#top-menu"), 
menuItems = topMenu.find("a"), 
    // Anchors corresponding to menu items 
    scrollItems = menuItems.map(function(){ 
    var item = $($(this).attr("href")); 
    if (item.length) { return item; } 
}); 

wiem w ogóle, kod wyszuka wszystkie „a” linków, znaleźć href za pomocą funkcji attr(), a jeśli istnieje, dodaj go do mapy. Nie rozumiem tego, co oznacza dodatkowy selektor $()? Rozumiem, że oznacza wybranie/pobranie href dla tego elementu. Co robi funkcja $()? Czy jest to selektor zagnieżdżony? Próbowałem googling, ale nie mogłem znaleźć odpowiedzi na to, lub mój google-fu nie jest do normy.

Również robi

$($(this).attr("href")); 

tylko odzyskać łącza w sekcji-on następujący format index.html # sekcja-jednego lub #?

Aktualizacja

także, w jaki sposób '.length' ustalić, czy element istnieje w DOM? Kiedy sprawdzałem logi konsoli, link href z "index.html # section-one" zwróciłby wartość 0, podczas gdy jeden z "# section-one" powróciłby o długości 1. Dlaczego tak się dzieje?

+4

Zawija łańcuch w obiekcie jQuery, w twoim przypadku '# section-one', a następnie można wywoływać metody jQuery. – Tushar

+0

Hej Tushar, dzięki za naprawdę szybką odpowiedź! Jeśli moje zrozumienie jest poprawne, $ ($ this) .attr ("href")); tylko pobiera tekst po znaku #? –

+0

Nie, pobierze pełny tekst 'href' – Tushar

Odpowiedz

2

W twoim przypadku href to nazwy kotwic (lub identyfikatory fragmentów), które wygodnie podwajają się jako selektory id. Odwołując się do atrybutu href, a następnie zawijając go za pomocą $(), efektywnie wybierasz element z tym id.

Tak więc, zwykle przeskakuje do nazwanej kotwicy "faq", ale przez zawijanie wartości attr href, wybierasz $('#faq').

1
$($(this).attr("href")); 

W powyższym wyrażeniu $(this).attr("href") daje href atrybut z określonego elementu HTML, które jest łańcuchem. Jeśli chcesz przekonwertować ten ciąg do obiektu jQuery i zrobić dalszych manipulacji, można to osiągnąć stosując dodatkowe $() jak

$($(this).attr("href")) 
3

Ten kod zakłada, że ​​atrybut href będzie referencja id, jak #about. Zewnętrzna $() idzie naprzód i chwyta za Ciebie ten element .

+2

Nie tylko "id", ** dowolny selektor ** – Tushar

+2

Masz rację, ale tylko 'id' będzie poprawnym' href'. –