Zauważyłem podczas monitorowania / próby odpowiedzi na najczęściej zadawane pytania dotyczące jQuery, że istnieją pewne praktyki z użyciem javascript zamiast jQuery, które faktycznie pozwalają ci pisać mniej i robić ... cóż taką samą ilość. I może również przynieść korzyści w zakresie wydajności.
Konkretny przykład
$(this)
vs this
Wewnątrz zdarzenia kliknięcia odwołującego się do identyfikatora klikanych obiektów
jQuery
$(this).attr("id");
JavaScript
this.id;
Czy są jakieś inne popularne praktyki tego typu? Tam, gdzie pewne operacje Javascript można wykonać łatwiej, bez dodawania jQuery do miksu. Czy to rzadki przypadek? („skrótu” jQuery wymagającego więcej kodu)
EDYCJA: Chociaż doceniam odpowiedzi dotyczące jQuery vs. zwykła wydajność javascript, tak naprawdę szukam odpowiedzi bardziej ilościowych. Podczas korzystania z jQuery , przypadki, w których lepiej byłoby (czytelność / zwartość) używać zwykłego javascript zamiast używać $()
. Oprócz przykładu podanego w moim pierwotnym pytaniu.
źródło
this.id
?Odpowiedzi:
this.id
(jak wiesz)this.value
(w większości typów danych wejściowych. tylko problemy, które znam, to IE, gdy a<select>
nie mavalue
ustawionych właściwości swoich<option>
elementów lub danych wejściowych radia w Safari).this.className
aby uzyskać lub ustawić całą właściwość „class”this.selectedIndex
przeciwko a,<select>
aby uzyskać wybrany indeksthis.options
przeciw a,<select>
aby uzyskać listę<option>
elementówthis.text
przeciwko,<option>
aby uzyskać jego treść tekstowąthis.rows
przeciwko,<table>
aby uzyskać kolekcję<tr>
elementówthis.cells
przeciw a,<tr>
aby uzyskać jego komórki (td i th)this.parentNode
uzyskać bezpośredniego rodzicathis.checked
aby uzyskać sprawdzony stancheckbox
Thanks @Tim Downthis.selected
aby uzyskać wybrany stanoption
podziękowania @ Tim Downthis.disabled
aby uzyskać wyłączony staninput
Thanks @Tim Downthis.readOnly
aby uzyskać stan readOnly:input
Thanks @Tim Downthis.href
przeciwko<a>
elementowi, aby uzyskaćhref
this.hostname
przeciwko<a>
elementowi, aby uzyskać jego domenęhref
this.pathname
przeciwko<a>
elementowi, aby uzyskać ścieżkę jegohref
this.search
przeciwko<a>
elementowi, aby uzyskać jego kwerendęhref
this.src
przeciwko elementowi, w którym poprawne jest posiadaniesrc
... Myślę, że masz pomysł.
Będą chwile, kiedy wydajność będzie kluczowa. Na przykład, jeśli wykonujesz coś w pętli wiele razy, możesz porzucić jQuery.
Ogólnie możesz wymienić:z:Powyżej było źle sformułowane.
getAttribute
nie jest zamiennikiem, ale pobiera wartość atrybutu wysłanego z serwera, a odpowiadająca musetAttribute
wartość ustawi go. Niezbędne w niektórych przypadkach.Poniższe zdania w pewnym sensie to obejmowały. Zobacz tę odpowiedź, aby uzyskać lepsze leczenie.
... aby uzyskać bezpośredni dostęp do atrybutu. Zauważ, że atrybuty nie są takie same jak właściwości (choć czasami się odbijają). Oczywiście, że
setAttribute
też.Załóżmy, że wystąpiła sytuacja, w której otrzymałeś stronę, na której musisz rozpakować wszystkie tagi określonego typu. Jest to krótkie i łatwe w jQuery:
Ale jeśli jest ich wiele, możesz zrobić trochę natywnego interfejsu API DOM:
Ten kod jest dość krótki, działa lepiej niż wersja jQuery i można go łatwo przekształcić w funkcję wielokrotnego użytku w osobistej bibliotece.
Może się wydawać, że mam nieskończoną pętlę z zewnętrzną z
while
powoduwhile(spans[0])
, ale ponieważ mamy do czynienia z „listą na żywo”, jest ona aktualizowana, gdy wykonujemyparent.removeChild(span[0]);
. Jest to całkiem sprytna funkcja, za którą tęsknimy podczas pracy z tablicą (lub obiektem podobnym do tablicy).źródło
this.value
tam, gdzie w niektórych przypadkach występuje kilka dziwactw przeglądarki. Wszystko zależy od twoich potrzeb. Istnieje wiele fajnych technik, które są łatwe bez jQuery, szczególnie gdy wydajność ma kluczowe znaczenie. Spróbuję wymyślić więcej.attr()
jest znacznie nadużywany. Jeśli masz do czynienia tylko z jednym elementem, rzadko będziesz go potrzebowaćattr()
. Dwa z moich ulubionych jest zamieszanie wokółchecked
nieruchomego wyboru (wszystkie rodzaje mistycznych zaklęć wokół tego jednego:$(this).attr("checked", "checked")
,$(this).is(":checked")
etc.) i podobnieselected
własności<option>
elementów.getAttribute()
. Prawie nigdy go nie potrzebujesz : jest zepsuty w IE, nie zawsze odzwierciedla aktualny stan i tak nie robi jQuery. Po prostu użyj właściwości. stackoverflow.com/questions/4456231/…Prawidłowa odpowiedź jest taka, że zawsze będziesz ponosił obniżenie wydajności, gdy używasz jQuery zamiast „zwykłego” starego JavaScript. To dlatego, że jQuery jest biblioteką JavaScript. To nie jest jakaś wymyślna nowa wersja JavaScript.
Powodem, dla którego jQuery jest potężny, jest to, że sprawia, że niektóre rzeczy są zbyt żmudne w sytuacji między przeglądarkami (AJAX jest jednym z najlepszych przykładów) i łagodzi niespójności między niezliczonymi dostępnymi przeglądarkami i zapewnia spójny interfejs API. Ułatwia także takie koncepcje, jak tworzenie łańcuchów, sugerowanie iteracji itp., Aby uprościć wspólną pracę nad grupami elementów.
Nauka jQuery nie zastąpi nauki JavaScript. Powinieneś mieć solidne podstawy w tym drugim, abyś w pełni docenił to, co znajomość tego pierwszego ułatwia ci.
- Edytowane w celu uwzględnienia komentarzy -
Ponieważ komentarze są szybkie do wskazania (i zgadzam się ze 100%), powyższe stwierdzenia odnoszą się do kodu testu porównawczego. „Natywne” rozwiązanie JavaScript (zakładając, że jest dobrze napisane) będzie lepsze niż rozwiązanie jQuery, które osiąga to samo w prawie każdym przypadku (chciałbym zobaczyć inny przykład). jQuery przyspiesza czas programowania, co jest znaczącą korzyścią, której nie zamierzam bagatelizować. Ułatwia łatwy do odczytania, łatwy do śledzenia kod, który jest więcej niż niektórzy programiści są w stanie stworzyć samodzielnie.
Moim zdaniem odpowiedź zależy od tego, co próbujesz osiągnąć. Jeśli, jak przypuszczałem na podstawie odwołania do korzyści z wydajności, dążysz do uzyskania najlepszej możliwej prędkości z aplikacji, to użycie jQuery wprowadza narzut za każdym razem, gdy dzwonisz
$()
. Jeśli zależy Ci na czytelności, spójności, kompatybilności z różnymi przeglądarkami itp., Z pewnością istnieją powody, aby faworyzować jQuery nad „rodzimym” JavaScript.źródło
$()
. Jeśli nie wykonasz tego połączenia, zaoszczędzisz czas.Istnieje framework o nazwie ... och, zgadnij co?
Vanilla JS
. Mam nadzieję, że masz żart ...: D Poświęca czytelność kodu dla wydajności ... Porównując go zjQuery
poniższym, możesz zauważyć, że wyszukiwanieDOM
elementuID
jest prawie 35 razy szybsze. :)Więc jeśli chcesz wydajności, lepiej wypróbuj Vanilla JS i wyciągnij własne wnioski. Być może JavaScript nie zawiesi GUI przeglądarki / zablokuje wątek interfejsu podczas intensywnego kodu, takiego jak wewnątrz
for
pętli.Na ich stronie głównej jest kilka porównań:
źródło
Odpowiedź jest już zaakceptowana, ale uważam, że żadna odpowiedź wpisana bezpośrednio tutaj nie może być wyczerpująca na liście natywnych metod / atrybutów javascript, które praktycznie gwarantowały obsługę wielu przeglądarek. W tym celu mogę skierować Cię do trybu quirksmode:
http://www.quirksmode.org/compatibility.html
Jest to być może najbardziej wyczerpująca lista tego, co działa, a co nie działa w jakiejkolwiek przeglądarce. Zwróć szczególną uwagę na sekcję DOM. To dużo do przeczytania, ale nie chodzi o to, aby przeczytać wszystko, ale użyć go jako odniesienia.
Kiedy zacząłem poważnie pisać aplikacje internetowe, wydrukowałem wszystkie tabele DOM i zawiesiłem je na ścianie, aby na pierwszy rzut oka wiedzieć, co jest bezpieczne w użyciu, a co wymaga włamań. Obecnie po prostu szukam w Google czegoś
quirksmode parentNode compatibility
, co mam wątpliwości.Jak wszystko inne, osąd jest głównie kwestią doświadczenia. Naprawdę nie polecałbym ci przeczytać całej strony i zapamiętać wszystkich problemów, aby dowiedzieć się, kiedy używać jQuery, a kiedy zwykłego JS. Pamiętaj tylko o liście. Wyszukiwanie jest dość łatwe. Z czasem rozwiniesz instynkt, kiedy preferowane jest zwykłe JS.
PS: PPK (autor strony) ma również bardzo fajną książkę, którą polecam przeczytać
źródło
Kiedy:
użyj JavaScript. W przeciwnym razie użyj jQuery (jeśli możesz).
Edycja : Ta odpowiedź dotyczy zarówno wyboru ogólnego zastosowania jQuery, jak i pominięcia go, a także wyboru, czy używać JS waniliowego wewnątrz jQuery. Wybieranie pomiędzy
attr('id')
i.id
pochylanie się na rzecz JS, przy jednoczesnym wybieraniu pomiędzyremoveClass('foo')
i.className = .className.replace( new Regexp("(?:^|\\s+)"+foo+"(?:\\s+|$)",'g'), '' )
pochylanie się na korzyść jQuery.źródło
.classList.remove('foo')
wydaje się działać dobrze w nowszych przeglądarkachOdpowiedzi innych koncentrowały się na szerokim pytaniu „jQuery vs. zwykły JS”. Sądząc z twojego OP, myślę, że po prostu zastanawiałeś się, kiedy lepiej użyć waniliowego JS, jeśli już zdecydowałeś się użyć jQuery. Twój przykład jest doskonałym przykładem tego, kiedy powinieneś używać waniliowej JS:
$(this).attr('id');
Jest wolniejszy i (moim zdaniem) mniej czytelny niż:
this.id
.Jest wolniejszy, ponieważ musisz rozłożyć nowy obiekt JS, aby pobrać atrybut w sposób jQuery. Teraz, jeśli zamierzasz
$(this)
wykonywać inne operacje, zapisz ten obiekt jQuery w zmiennej i działaj z nim. Jednak natknąłem się na wiele sytuacji, w których potrzebuję tylko atrybutu z elementu (jakid
lubsrc
).Myślę, że najczęstszym przypadkiem jest ten opisany w poście; ludzie
$(this)
niepotrzebnie zawijają się w obiekcie jQuery. Widzę to najczęściej za pomocąid
ivalue
(zamiast tego$(this).val()
).Edytować: Oto artykuł, który wyjaśnia, dlaczego używanie jQuery w
attr()
przypadku jest wolniejsze. Spowiedź: ukradłem ją z tagu wiki, ale myślę, że warto wspomnieć o tym pytaniu.Edytuj ponownie: Biorąc pod uwagę wpływ na czytelność / wydajność bezpośredniego dostępu do atrybutów, powiedziałbym, że dobrą zasadą jest prawdopodobnie próba użycia
this.<attributename>
gdy to możliwe. Prawdopodobnie istnieją przypadki, w których to nie zadziała z powodu niespójności przeglądarki, ale prawdopodobnie lepiej wypróbować to najpierw i wrócić do jQuery, jeśli to nie działa.źródło
this.style.display = 'none'
. Czy to jest lepsze niż$(this).hide()
? Twierdziłbym, że ten drugi jest bardziej czytelny, ale ten pierwszy jest prawdopodobnie szybszy. Nie zaszkodzi eksperymentować samemu, aby sprawdzić, czy pewne akcje będą działały w przeglądarkach bez jQuery - zazwyczaj robię to przed zawinięciem elementu w obiekcie jQuery w celu wykonania operacji.Jeśli najbardziej martwisz się wydajnością, Twój główny przykład uderza w głowę. Niepotrzebne lub zbędne wywoływanie jQuery jest, IMHO, drugą główną przyczyną niskiej wydajności (pierwszą z nich jest słaba przemiana DOM).
To nie jest tak naprawdę przykład tego, czego szukasz, ale widzę to tak często, że trzeba wspomnieć: Jednym z najlepszych sposobów na przyspieszenie wydajności skryptów jQuery jest buforowanie obiektów jQuery i / lub użycie łańcucha:
źródło
var something
tak naprawdę nie musiałem buforować obiektu jQuery (ponieważ korzystałem z łańcucha), ale i tak robię to z przyzwyczajenia.$('.something')
Dwukrotne wywołanie oznacza, że jQuery musi dwukrotnie przejść przez DOM, szukając wszystkich elementów za pomocą tego selektora.$(this)
zmniejsza liczbę wywołań funkcji jQuery. Zapewni to największy zysk w scenariuszu pętli.element
jest równa$(this)
. Nie zawiera wielu elementów.Odkryłem, że JS i JQ z pewnością się pokrywają. Kod, który pokazałeś, jest tego dobrym przykładem. Szczerze mówiąc, najlepszym powodem do korzystania z JQ nad JS jest po prostu kompatybilność przeglądarki. Zawsze pochylam się w kierunku JQ, nawet jeśli mogę coś osiągnąć w JS.
źródło
To jest mój osobisty pogląd, ale ponieważ jQuery i tak jest JavaScript, myślę, że teoretycznie nie może on działać lepiej niż waniliowy JS.
Ale praktycznie może działać lepiej niż ręcznie napisany JS, ponieważ odręczny kod może nie być tak wydajny jak jQuery.
Podsumowując - do mniejszych rzeczy zwykle używam waniliowej JS, do intensywnych projektów JS lubię używać jQuery i nie wymyślać koła - jest to również bardziej produktywne.
źródło
Lista właściwości aktywnych pierwszej odpowiedzi
this
jako elementu DOM jest dość kompletna.Interesujące może być również poznanie innych.
Gdy to jest dokument:
this.forms
dostaćHTMLCollection
aktualne formularze dokumentów,this.anchors
aby uzyskaćHTMLCollection
wszystkoHTMLAnchorElements
zname
ustawieniem,this.links
aby uzyskaćHTMLCollection
wszystkieHTMLAnchorElement
zhref
ustawieniem,this.images
zdobyćHTMLCollection
wszystkieHTMLImageElement
sthis.applets
Podczas pracy z
document.forms
,document.forms[formNameOrId]
dostaje tak nazwie lub zidentyfikowany formularza.Gdy jest to formularz:
this[inputNameOrId]
aby uzyskać tak nazwane lub zidentyfikowane poleGdy jest to pole formularza:
this.type
aby uzyskać typ polaUcząc się selektorów jQuery, często pomijamy naukę już istniejących właściwości elementów HTML, do których dostęp jest tak szybki.
źródło
document.embeds
idocument.plugins
są również szeroko obsługiwane (DOM 0).document.scripts
jest także wygodną kolekcją, zdefiniowaną w specyfikacji HTML5 i szeroko obsługiwaną (i Firefox 9+ ).Jak zwykle spóźniam się na to przyjęcie.
To nie dodatkowa funkcjonalność sprawiła, że zdecydowałem się na użycie jQuery, choć było to tak atrakcyjne. W końcu nic nie powstrzymuje Cię przed pisaniem własnych funkcji.
Faktem było, że było tak wiele sztuczek do nauczenia się podczas modyfikowania DOM, aby uniknąć wycieków pamięci (mówię o tobie IE). Posiadanie jednego centralnego zasobu, który zarządzałby dla mnie wszystkimi tego typu problemami, napisanego przez ludzi, którzy byli o wiele lepszymi programistami JS niż kiedykolwiek będę, który był stale sprawdzany, poprawiany i testowany, to był bóg.
Wydaje mi się, że ten rodzaj mieści się w argumencie wsparcia / abstrakcji między przeglądarkami.
I oczywiście jQuery nie wyklucza użycia prostej JS, gdy jej potrzebujesz. Zawsze czułem, że ta dwójka wydaje się bezproblemowo ze sobą współpracować.
Oczywiście, jeśli twoja przeglądarka nie jest obsługiwana przez jQuery lub wspierasz środowisko niższej klasy (starszy telefon?), Problem może stanowić duży plik .js. Pamiętasz, kiedy jQuery było małe?
Ale zwykle różnica w wydajności nie stanowi problemu. Musi być tylko wystarczająco szybki. Ponieważ Gigahertz cykli procesora marnuje się co sekundę, bardziej martwię się wydajnością moich koderów, jedynych zasobów programistycznych, które nie podwoją mocy co 18 miesięcy.
To powiedziawszy, że obecnie szukam problemów z dostępnością i najwyraźniej .innerHTML jest trochę nie z tym. jQuery oczywiście zależy od .innerHTML, więc teraz szukam frameworka, który będzie zależał od nieco żmudnych metod, które są dozwolone. I mogę sobie wyobrazić, że taki framework będzie działał wolniej niż jQuery, ale dopóki będzie on działał wystarczająco dobrze, będę szczęśliwy.
źródło
Oto nietechniczna odpowiedź - wiele zadań może nie zezwalać na niektóre biblioteki, takie jak jQuery.
W rzeczywistości Google nie zezwala na stosowanie jQuery w żadnym z ich kodów (ani React, ponieważ jest własnością Facebooka), czego możesz nie znać, dopóki ankieter nie powie „Przepraszam, ale nie możesz użyć jQuery, nie jest włączony zatwierdzona lista w XYZ Corporation ”. Waniliowy JavaScript działa absolutnie wszędzie i za każdym razem i nigdy nie spowoduje tego problemu. Jeśli polegasz na bibliotece, tak, zyskujesz szybkość i łatwość, ale tracisz uniwersalność.
Poza tym, mówiąc o przeprowadzaniu wywiadów, drugą wadą jest to, że jeśli mówisz, że musisz użyć biblioteki, aby rozwiązać problem JavaScript podczas quizu kodowego, okazuje się, że tak naprawdę nie rozumiesz problemu, który wygląda trochę źle. Natomiast jeśli rozwiążesz go za pomocą surowego waniliowego JavaScript, pokaże to, że faktycznie rozumiesz i możesz rozwiązać każdą część problemu, który ci rzucają.
źródło
$(this)
jest inny niżthis
:Używając tego
$(this)
masz pewność, że prototyp jQuery jest przekazywany na obiekt.źródło