Kiedy używać Vanilla JavaScript vs. jQuery?
Zauważyłem podczas monitorowania / próby odpowiedzi na typowe pytania jQuery, że istnieją pewne praktyki za pomocą javascript, zamiast jQuery, które faktycznie pozwalają pisać mniej i robić ... tyle samo. I może również przynieść korzyści w zakresie wydajności.
Konkretny przykład
$(this)
vs this
Wewnątrz zdarzenia click odwołującego się do identyfikatora klikniętych obiektów
JQuery
$(this).attr("id");
Javascript
this.id;
Czy są jakieś inne wspólne takie praktyki? Tam, gdzie pewne operacje Javascript mogą być wykonywane łatwiej, bez wprowadzania jQuery do miksu. A może to rzadki przypadek? (jQuery "shortcut" faktycznie wymagający więcej kodu)
EDIT: chociaż doceniam odpowiedzi dotyczące wydajności jQuery vs. zwykły javascript, w rzeczywistości Szukam znacznie bardziej ilościowych odpowiedzi. podczas korzystania z jQuery , przypadki, w których faktycznie byłoby lepiej (czytelność/zwartość) używać zwykłego javascript zamiast używać $()
. Oprócz przykładu podałem w moim pierwotnym pytaniu.
13 answers
-
this.id
(Jak wiesz) -
this.value
(na większości typów wejść. jedyne problemy, które znam, to IE, gdy<select>
nie ma właściwościvalue
ustawionych na elementach<option>
, lub wejścia radiowe w Safari.) -
this.className
aby uzyskać lub ustawić całą właściwość "class" -
this.selectedIndex
przeciwko<select>
aby uzyskać wybrany indeks -
this.options
przeciwko<select>
aby uzyskać listę<option>
elementów -
this.text
przeciwko<option>
, aby uzyskać jego treść tekstową -
this.rows
przeciwko<table>
aby uzyskać zbiór<tr>
elementów -
this.cells
przeciwko<tr>
, aby uzyskać jego komórki (td & th) -
this.parentNode
aby uzyskać bezpośredni rodzic -
this.checked
aby uzyskać sprawdzony stancheckbox
Thanks @ Tim Down -
this.selected
aby uzyskać wybrany stanoption
Thanks @ Tim Down -
this.disabled
aby uzyskać stan niepełnosprawnościinput
Thanks @ Tim Down -
this.readOnly
aby uzyskać odczyt stanuinput
Thanks @ Tim Down -
this.href
przeciwko elementowi<a>
, aby uzyskać jegohref
-
this.hostname
przeciwko elementowi<a>
, aby uzyskać domenę jegohref
-
this.pathname
przeciwko elementowi<a>
, aby uzyskać ścieżkę jegohref
-
this.search
przeciwko elementowi<a>
, aby uzyskać querystring jegohref
-
this.src
przeciwko elementowi, w którym ważne jest, aby miećsrc
...Chyba rozumiesz.
Będą czasy, kiedy wydajność będzie kluczowe. Na przykład, jeśli wykonujesz coś w pętli wiele razy, możesz chcieć porzucić jQuery.
ogólnie można zastąpić:
$(el).attr('someName');
Z:
Powyżej było źle sformułowane. getAttribute
nie jest zamiennikiem, ale pobiera wartość atrybutu wysłanego z serwera, a odpowiadająca mu setAttribute
go ustawi. Konieczne w niektórych przypadkach.
Zdania poniżej tak jakby to ujęły. zobacz tę odpowiedź {[72] } na lepsze leczenie.
el.getAttribute('someName');
... aby uzyskać bezpośredni dostęp do atrybutu. Zauważ, że atrybuty nie są takie same jak właściwości(choć czasami się odzwierciedlają). Oczywiście, że jest.
Powiedzmy, że miałeś sytuację, w której otrzymałeś stronę, na której musisz rozpakować wszystkie tagi określonego typu. Jest to krótkie i łatwe z jQuery:
$('span').unwrap(); // unwrap all span elements
Ale jeśli jest ich wiele, możesz chcieć zrobić małe natywne API DOM:
var spans = document.getElementsByTagName('span');
while( spans[0] ) {
var parent = spans[0].parentNode;
while( spans[0].firstChild ) {
parent.insertBefore( spans[0].firstChild, spans[0]);
}
parent.removeChild( spans[0] );
}
Ten kod jest dość krótki, wykonuje lepsze niż wersja jQuery i można je łatwo przekształcić w funkcję wielokrotnego użytku w osobistej bibliotece.
Może się wydawać, że mam nieskończoną pętlę z zewnętrznym while
Z powodu while(spans[0])
, ale ponieważ mamy do czynienia z "listą NA ŻYWO", jest ona aktualizowana, gdy robimy parent.removeChild(span[0]);
. Jest to dość sprytna funkcja, której brakuje podczas pracy z tablicą (lub obiektem podobnym do tablicy).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:57
Poprawną odpowiedzią jest to, że będziesz Zawsze brać karę za wydajność, gdy używasz jQuery zamiast "zwykłego starego" rodzimego 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, które są zbyt nudne w sytuacji cross-browser (AJAX jest jednym z najlepszych przykładów) i wygładza niespójności między niezliczoną ilością dostępnych przeglądarek i zapewnia spójne API. Ułatwia również takie koncepcje jak łączenie łańcuchowe, implikowana iteracja itp., aby uprościć pracę nad grupami elementów razem.
Nauka jQuery nie zastępuje Nauki JavaScript. Powinieneś mieć solidne podstawy w tym drugim, abyś w pełni docenił to, co znajomość tego pierwszego ułatwia ci.
-- Edited to encompass comments --
Jako, że komentarze są szybkie do zwrócenia uwagi (i zgadzam się w 100%) powyższe stwierdzenia odnoszą się do kod benchmarkingowy. "Natywne" rozwiązanie JavaScript (zakładając, że jest dobrze napisane) przewyższy rozwiązanie jQuery, które osiąga to samo w prawie każdym przypadku(chciałbym zobaczyć inny przykład). jQuery przyspiesza czas rozwoju, co jest znaczącą korzyścią, której nie chcę bagatelizować. Ułatwia łatwy do odczytania, łatwy do naśladowania kod, który jest więcej niż niektórzy programiści są w stanie stworzyć na własną rękę.
Moim zdaniem odpowiedź zależy od tego, co próbujesz to osiągnąć. Jeśli, jak założyłem na podstawie Twojego odniesienia do korzyści wydajnościowych, jesteś po najlepszej możliwej prędkości z aplikacji, to Korzystanie z jQuery wprowadza narzut za każdym razem, gdy dzwonisz $()
. Jeśli chodzi o czytelność, spójność, kompatybilność między przeglądarkami itp., to z pewnością istnieją powody, aby faworyzować jQuery zamiast "natywnego" JavaScript.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 22:36:36
Istnieje framework o nazwie... zgadnij co? Vanilla JS
. Mam nadzieję, że rozumiesz dowcip... : D poświęca czytelność kodu dla wydajności... Porównując go z jQuery
poniżej widać, że pobieranie DOM
elementu przez ID
jest prawie 35x szybsze. :)
for
pętla.
Vanilla JS to szybki, lekki, wieloplatformowy framework do budowanie niesamowitych, potężnych aplikacji JavaScript.
Na ich stronie głównej jest kilka porównań perf:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 16:51:57
Istnieje już akceptowana odpowiedź, ale wierzę, że żadna odpowiedź wpisana bezpośrednio tutaj nie może być wyczerpująca na liście natywnych metod/atrybutów javascript, które praktycznie gwarantują obsługę między przeglądarkami. W tym celu mogę przekierować cię do quirksmode:
Http://www.quirksmode.org/compatibility.html
Jest to chyba najbardziej wyczerpująca lista tego, co działa, a co nie działa w jakiej przeglądarce. Zwróć szczególną uwagę na sekcję DOM. To jest dużo do przeczytaj, 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 powiesiłem je na ścianie, aby na pierwszy rzut oka wiedzieć, co jest bezpieczne w użyciu i co wymaga hacków. W dzisiejszych czasach po prostu wygoogluję coś w stylu quirksmode parentNode compatibility
, gdy mam wątpliwości.
PS: PPK (autor strony) ma też bardzo ładną książkę, którą polecam przeczytać
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-11 04:14:50
Kiedy:
- wiesz, że istnieje niezakłócona obsługa między przeglądarkami dla tego, co robisz, i
- nie jest znacząco więcej kodu do wpisania, a
- nie jest znacznie mniej czytelny, a
- jesteś przekonany, że jQuery nie wybierze różnych implementacji opartych na przeglądarce, aby osiągnąć lepszą wydajność, to:
Użyj JavaScript. W przeciwnym razie użyj jQuery (jeśli możesz).
Edit : Ta odpowiedź dotyczy zarówno wybierając użycie jQuery ogólnie, a nie pomijając go, a także wybierając, czy używać vanilla JS wewnątrz jQuery. Wybór pomiędzy attr('id')
a .id
pochyla się na rzecz JS, podczas gdy wybór pomiędzy removeClass('foo')
a .className = .className.replace( new Regexp("(?:^|\\s+)"+foo+"(?:\\s+|$)",'g'), '' )
pochyla się na rzecz jQuery.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 22:24:18
Odpowiedzi innych skupiły się na szerokim pytaniu " jQuery vs. zwykły JS."Sądząc po twoim OP, myślę, że po prostu zastanawiasz się, kiedy lepiej jest użyć vanilla JS, jeśli już zdecydowałeś się użyć jQuery. Twój przykład jest doskonałym przykładem, kiedy powinieneś używać vanilla JS:
$(this).attr('id');
Jest zarówno wolniejszy i (moim zdaniem) mniej czytelny niż:
this.id
.
Jest wolniejszy, ponieważ musisz uruchomić nowy obiekt JS, aby odzyskać atrybut jQuery way. Jeśli masz zamiar używać $(this)
do wykonywania innych operacji, zapisz ten obiekt jQuery w zmiennej i z nim operuj. Jednak natknąłem się na wiele sytuacji, w których po prostu potrzebuję atrybutu z elementu (jak id
lub src
).
Czy są jakieś inne powszechne praktyki tak? Gdzie niektóre Javascript operacje mogą być realizowane łatwiejsze, bez wprowadzania jQuery do mieszanka. A może to rzadki przypadek? (z jQuery "Skrót" faktycznie wymagający więcej kodu)
Myślę, że najczęstszym przypadkiem jest ten, który opisujesz w swoim poście; ludzie niepotrzebnie owijają $(this)
w obiekt jQuery. Widzę to najczęściej z id
i value
(zamiast $(this).val()
).
Edytuj: tutaj jest artykuł, który wyjaśnia dlaczego używanie jQuery w przypadku attr()
jest wolniejsze. Wyznanie: ukradłem to z tag wiki, ale myślę, że warto wspomnieć o pytanie.
Edit again: biorąc pod uwagę wpływ czytelności / wydajności bezpośredniego dostępu do atrybutów, powiedziałbym, że dobrą zasadą jest prawdopodobnie próba użycia this.<attributename>
, gdy jest to możliwe. Prawdopodobnie są pewne przypadki, w których to nie zadziała z powodu niespójności przeglądarki, ale prawdopodobnie lepiej najpierw spróbować i wrócić do jQuery, jeśli to nie działa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 23:01:56
Jeśli zależy Ci głównie na wydajności, twój główny przykład trafia w sedno. Niepotrzebnie lub redundantnie wywoływanie jQuery jest, IMHO, drugą główną przyczyną powolnego działania (pierwszą jest słaba TRAWERSACJA DOM).
To nie jest naprawdę przykład tego, czego szukasz, ale widzę to tak często, że można o tym wspomnieć: jednym z najlepszych sposobów na przyspieszenie wydajności skryptów jQuery jest buforowanie obiektów jQuery i / lub używanie łańcucha:
// poor
$(this).animate({'opacity':'0'}, function() { $(this).remove(); });
// excellent
var element = $(this);
element.animate({'opacity':'0'}, function() { element.remove(); });
// poor
$('.something').load('url');
$('.something').show();
// excellent
var something = $('#container').children('p.something');
something.load('url').show();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 22:09:18
Odkryłem, że na pewno jest nakładanie się JS i JQ. Kod, który pokazałeś, jest tego dobrym przykładem. Szczerze mówiąc, najlepszym powodem do używania JQ nad JS jest po prostu kompatybilność przeglądarki. Zawsze skłaniam się ku JQ, nawet jeśli mogę coś osiągnąć w JS.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 21:57:51
To jest moje osobiste zdanie, ale ponieważ jQuery i tak jest JavaScript, myślę, że teoretycznie nie może działać lepiej niż vanilla js kiedykolwiek.
Ale praktycznie może działać lepiej niż ręcznie pisany js, ponieważ czyjś ręcznie pisany kod może nie być tak wydajny jak jQuery.
Reasumując-do mniejszych rzeczy używam vanilla JS, do intensywnych projektów js lubię używać jQuery i nie wymyślać koła na nowo - jest to również bardziej produktywne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-18 00:51:53
Lista aktywnych właściwości pierwszej odpowiedzi this
jako elementu DOM jest całkiem kompletna.
Może zainteresować Cię również poznanie innych.
Gdy jest to dokument:
-
this.forms
Aby uzyskaćHTMLCollection
z obecnych formularzy dokumentów, -
this.anchors
aby uzyskaćHTMLCollection
wszystkichHTMLAnchorElements
zname
ustawionych, -
this.links
aby uzyskaćHTMLCollection
wszystkichHTMLAnchorElement
S zhref
ustawionych, -
this.images
aby uzyskaćHTMLCollection
wszystkichHTMLImageElement
s - i to samo dotyczy przestarzałych apletów jak
this.applets
Kiedy pracujesz z document.forms
, document.forms[formNameOrId]
pobiera tak nazwany lub zidentyfikowany formularz.
Gdy jest to forma:
-
this[inputNameOrId]
Aby uzyskać tak nazwane lub zidentyfikowane pole
Gdy jest to pole formularza:
-
this.type
aby uzyskać Typ pola
Ucząc się selektorów jQuery, często pomijamy uczenie się już istniejących właściwości elementów HTML, do których dostęp jest tak szybki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-23 16:28:51
$(this)
różni się od this
:
Używając $(this)
upewniasz się, że prototyp jQuery jest przekazywany do obiektu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-21 12:58:45
Jak zwykle spóźnię się na tę imprezę.
To nie była dodatkowa funkcjonalność, która sprawiła, że zdecydowałem się na użycie jQuery, tak atrakcyjne jak to było. W końcu nic nie powstrzymuje cię od pisania własnych funkcji.
To był fakt, że było tak wiele sztuczek, aby nauczyć się podczas modyfikowania DOM, aby uniknąć wycieków pamięci(mówię o Tobie IE). Mieć jeden centralny zasób, który zarządzał wszystkimi tego rodzaju problemami dla mnie, napisany przez ludzi, którzy byli o wiele lepszymi koderami JS niż kiedykolwiek będzie, który był nieustannie sprawdzany, poprawiany i testowany został zesłany przez Boga.
Wydaje mi się, że tego rodzaju podpada pod argument cross browser support/abstraction.
I oczywiście jQuery nie wyklucza użycia prostego JS, gdy go potrzebujesz. Zawsze wydawało mi się, że oboje doskonale ze sobą współpracują.
Oczywiście jeśli twoja przeglądarka nie jest obsługiwana przez jQuery lub obsługujesz środowisko low end (starszy telefon?), a następnie dużą .plik js może być problemem. Pamiętaj kiedy jQuery było małe?
Ale zwykle różnica w wydajności nie jest problemem. Musi być wystarczająco szybki. Ponieważ Gigaherce cykli procesora będą marnować się co sekundę, Jestem bardziej zainteresowany wydajnością moich koderów, jedynymi zasobami programistycznymi, które nie podwajają mocy co 18 miesięcy.
To powiedziało, że obecnie zajmuję się problemami z dostępnością i najwyraźniej.innerHTML jest trochę Nie Nie z tym. jQuery oczywiście zależy od .innerHTML, so teraz szukam ramy, która będzie zależeć 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 działał wystarczająco dobrze, będę szczęśliwy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 05:17:52
Oto nietechniczna odpowiedź - wiele zadań może nie zezwalać na niektóre biblioteki, takie jak jQuery.
W rzeczywistości, w rzeczywistości, Google nie zezwala jQuery w żadnym z ich kodu (ani reagować, ponieważ jest własnością Facebook), które może nie wiedzieć, dopóki ankieter mówi "Przepraszam, ale nie można używać jQuery, to nie jest na liście zatwierdzonych W Xyz Corporation". Vanilla JavaScript działa absolutnie wszędzie, za każdym razem, i nigdy nie daje ten problem. Jeśli polegasz na bibliotece tak masz szybkość i łatwość, ale tracisz uniwersalność.
Ponadto, mówiąc o wywiadach, drugą wadą jest to, że jeśli mówisz, że musisz użyć biblioteki do rozwiązania problemu JavaScript podczas quizu kodowego, to wychodzi na to, że nie rozumiesz problemu, co wygląda trochę źle. Podczas gdy jeśli rozwiążesz go w surowym JavaScript waniliowym, pokazuje to, że naprawdę rozumiesz i możesz rozwiązać każdą część problemu, który rzucają przed tobą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-18 00:46:43