pułapki jQuery, aby uniknąć [zamknięty]

210

Zaczynam projekt od jQuery.

Jakie pułapki / błędy / nieporozumienia / nadużycia / nadużycia miałeś w swoim projekcie jQuery?

flybywire
źródło
4
To powinno nie zostały zamknięte za „nie konstruktywne”. Zmaterializowało się kilka bardzo pomocnych odpowiedzi, a pytanie pojawiło się już 220 razy. Głosuj ponownie, jeśli masz wystarczającą karmę.
Roy Prins
Wydaje mi się, że jQuery sam w sobie jest
pułapką

Odpowiedzi:

189

Nieświadomość wydajności i nadużywanie selektorów zamiast przypisywania ich do zmiennych lokalnych. Na przykład:-

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

Zamiast:-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

Lub jeszcze lepiej z łańcuchem :

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

Uznałem to za oświecający moment, kiedy zdałem sobie sprawę, jak działają stosy połączeń.

Edycja: uwzględniono sugestie w komentarzach.

Gavin Gilmour
źródło
16
+1 za link do youtube. cholera, dużo się nauczyłem.
Jason
23
Myślę, że przypisywanie rzeczy do zmiennych lokalnych jest świetne, ale nie zapominaj o mocy łańcucha (z twojego przykładu): $ ("# label"). Method (). Method2 (). Css ("background-color", " czerwony");
Lance McNearney,
Film na YouTube był świetny. Widziałem inne prezentacje Google na ten temat i wciąż nauczyłem się kilku rzeczy! Dzięki!
Gabriel Hurley,
+1 za link, również świetnie!
Josh Stodola,
7
To rodzaj konwencji używania znaku dolara dla zmiennych w kontekście jQuery. Więc możesz chcieć pisaćvar $label = $('#label');
Tim Büthe
90

Dowiedz się, jak korzystać z kontekstu. Zwykle selektor jQuery przeszuka cały dokument:

// This will search whole doc for elements with class myClass
$('.myClass');

Ale możesz przyspieszyć, wyszukując w kontekście:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
powolności
źródło
9
Aaaaaaah! Cóż, to naprawiono około 1 000 000 moich błędów. +1
jammus
4
Wygląda na to, że ostatni punkt jest niepoprawny - groups.google.co.uk/group/jquery-dev/browse_thread/thread/…
James
1
Dzięki za zwrócenie uwagi na JP. Co teraz zrobić ... Czy powinienem usunąć swoją odpowiedź, aby nikt inny nie oszalał i nie zmienił kodu na darmo?
slolife
Nie, to nadal dobry punkt, jeśli chodzi o optymalizację. :)
James
2
jQuery sprawdza, czy kontekst jest instancją jQuery, więc nie ma powodu [0]. $('.myClass', ct);lub jeśli wiesz, że ct jest instancją jQuery, możesz użyć findct.find(".myClass")
gradbot
62

Nie używaj czystych selektorów klas, takich jak to:

$('.button').click(function() { /* do something */ });

Spowoduje to, że spojrzymy na każdy element, aby sprawdzić, czy ma on klasę „przycisku”.

Zamiast tego możesz pomóc, na przykład:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

Nauczyłem się tego w zeszłym roku z bloga Rebecca Murphy

Aktualizacja - Ta odpowiedź została udzielona ponad 2 lata temu i jest niepoprawna dla bieżącej wersji jQuery. Jeden z komentarzy zawiera test, aby to udowodnić. Istnieje również zaktualizowana wersja testu, która zawiera wersję jQuery w momencie odpowiedzi.

BrianH
źródło
6
Miałem też wrażenie, że było odwrotnie. Być może dzieje się tak w przeglądarkach, które nie implementują getElementsByClassName, ale w przeciwnym razie po prostu dajesz jQuery więcej pracy. Bardzo chciałbym zobaczyć, jak Rebecca publikuje jakieś testy porównawcze :)
Alex Barrett
7
OBNIŻASZ ilość pracy, którą musi wykonać. To tak, jakby powiedzieć komuś, żeby wyciągnął skarpetki z szuflady w komodzie, zamiast kazać im wyjąć skarpetki z pokoju. Znacząco zmniejsza ilość „patrzenia”, którą musi zrobić.
Sneakyness,
4
Odwrotna jest prawda, gdy piszesz CSS (przynajmniej włączając znacznik elementu). Zobacz code.google.com/speed/page-speed/docs/…
kmiyashiro
7
@ Sneakyness Nie wszystko ma dokładny odpowiednik prawdziwego życia. Na przykład $('.b')można użyć, document.getElementsByClassName('b')jeśli przeglądarka go obsługuje, ale $('a.b')spowoduje to, że uzyska wszystkie pasujące elementy z klasą, ba następnie potwierdzi, że są kotwicami w operacji dwuetapowej. To ostatnie wydaje mi się więcej pracy. Dla prawdziwej analogii z życia spróbuj tego: Znajdź wszystkie skarpetki w moim pokoju. Teraz wyrzuć te, których nie ma w mojej komodzie.
alex
2
Uważam, że błędne przekonanie na temat selektorów wynika z faktu, że w starszych wersjach jquery szybciej było robić $ („# foo”) niż $ („div # foo”), ponieważ z definicji identyfikator jest unikalny. Jestem jednak pewien, że zostało to naprawione w późniejszych wydaniach, ale to zalecenie dotyczyło tylko identyfikatorów, a nie innych typów selektorów
Alex Heyd
35

Spróbuj podzielić anonimowe funkcje, aby móc ich ponownie użyć.

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );
plac Czerwony
źródło
19
Myślę, że dotyczy to mniej więcej tego samego stopnia, w jakim kod synchroniczny (wbudowany) powinien zostać podzielony na nazwane funkcje. Jeśli masz fragment kodu, który błaga o nadanie nazwy, wybierz go. Ale nie przesuwaj kodu poza linię tylko dlatego, że zawijasz go wewnątrz funkcji; funkcje anonimowe istnieją z dobrego powodu.
Dan Breslau,
4
W rzeczywistości lubię nadawać mojej nazwie nazwę. Jest to bardzo przydatne podczas debugowania kodu i zamiast niekończącej się listy anonimowych funkcji, widzisz odpowiednio nazwane funkcje.
SolutionYogi
1
Twój punkt widzenia jest słuszny i prawdopodobnie sam się o to potknąłem kilka razy. Mimo to „ mniej więcej ten sam stopień” nadal działa dla mnie.
Dan Breslau,
1
esp. jeśli wiązanie odbywa się w pętli!
daniellmb
Funkcje nazwane przynoszą również wiele korzyści podczas debugowania; nic nie jest do niczego więcej niż spojrzenie na callstack 8 poziomów głębokości, który ma tylko (anonymous). Przeczytaj więcej na ten temat tutaj: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
Ken
34
  • Unikaj nadużywania gotowego dokumentu.
  • Zachowaj dokument gotowy tylko do inicjalizacji kodu.
  • Zawsze wyodrębnij funkcje poza dokumentem gotowe, aby można było ich ponownie użyć.

Widziałem setki wierszy kodu w instrukcji ready doc. Brzydki, nieczytelny i niemożliwy do utrzymania.

Peter Mortensen
źródło
6
+1. Ogólnie rzecz biorąc, większość kodu jQuery, który widziałem, używa funkcji z setkami linii. Nie wiem, dlaczego „programiści jQuery” nie lubią używać mniejszych funkcji.
SolutionYogi
6
@SolutionYogi, ponieważ większość to po prostu JS noobs?
adamJLev
Jestem za tym, że nie umieszczam zbyt długich funkcji w dokumencie, to dobra rada. Jednak tworzenie wielu małych funkcji składowych uruchamianych z funkcji nadrzędnej, która nie jest gotowa w dokumencie, niekoniecznie jest najlepszą praktyką. Jeśli funkcja nadrzędna jest jedyną, która korzysta z tych fragmentów kodu, lepiej umieścić ją w jednej funkcji, nawet jeśli trudniej ją odczytać. Wywoływanie funkcji ma duży narzut i jeśli używasz kodu tylko w jednym kontekście, należy tego unikać.
sage88
34

Korzystając z $.ajaxfunkcji żądań Ajax do serwera, należy unikać używania completezdarzenia do przetwarzania danych odpowiedzi. Uruchomi się, czy żądanie zakończyło się powodzeniem, czy nie.

Zamiast tego completeużyj success.

Zobacz Wydarzenia Ajax w dokumentacji.

Patrick McElhaney
źródło
1
Od czasu do czasu odnoszę sukcesy w porównaniu z sukcesem. Czy możesz wyjaśnić, dlaczego uważasz, że ukończenie jest lepsze?
Neil N
1
Nie twierdzę, że ukończenie jest lepsze. To, co próbowałem powiedzieć, to to, że musisz unikać wprowadzającego w błąd pełnego użycia i powinieneś użyć sukcesu, aby móc przetwarzać dane odpowiedzi.
Artem Barger,
2
Cóż, zawsze się nazywa. Nie zgodziłbym się jednak. Kompletny jest najlepszy do ukrycia ładowania gif itp. Powinieneś wykorzystać sukces do obsługi odpowiedzi i błędu w przypadku wszelkich błędów oczywiście.
redsquare
1
Sugeruje wykorzystanie sukcesu zamiast pełnego. „zakończone” zawsze uruchamia się, gdy żądanie ajax jest „ukończone”, nie ma znaczenia, że ​​zostało zakończone pomyślnie lub bez powodzenia.
SolutionYogi
@redsquare, czy możesz rozwinąć tę kwestię, z którą się nie zgadzasz? Miałem na myśli proces przetwarzania danych i nie miałem nic przeciwko zdjęciom ukrywającym / pokazującym możliwości, które masz z kompletnym operatorem.
Artem Barger,
24

„Łączenie” wydarzeń animacyjnych z wywołaniami zwrotnymi.

Załóżmy, że chcesz animować akapit znikający po kliknięciu. Chciałeś też później usunąć element z DOM. Możesz pomyśleć, że możesz po prostu połączyć metody:

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

W tym przykładzie funkcja .remove () zostanie wywołana przed zakończeniem funkcji .fadeOut (), niszcząc efekt stopniowego zanikania i powodując natychmiastowe zniknięcie elementu. Zamiast tego, jeśli chcesz uruchomić polecenie dopiero po zakończeniu poprzedniego, użyj funkcji wywołania zwrotnego:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

Drugi parametr .fadeOut () to anonimowa funkcja, która uruchomi się po zakończeniu animacji .fadeOut (). To powoduje stopniowe zanikanie, a następnie usunięcie elementu.

Sampson
źródło
24

Jeśli powiążesz to samo wydarzenie wiele razy, zostanie ono wywołane wiele razy. Zazwyczaj zawsze chodzę unbind('click').bind('click')po prostu dla bezpieczeństwa

Scott Evernden
źródło
2
Nie jest to specyficzne dla jQuery, choć należy pamiętać o ważnej rzeczy.
SolutionYogi
11
Możesz użyć wydarzeń na żywo, aby nie wiązać tego samego wydarzenia dwa razy.
Powerlord,
Live ma swoje własne problemy z wydajnością, jeśli jest używane w nadmiarze. Lepiej w 1.3.3, gdzie możesz podać kontekst.
redsquare
23

Nie nadużywaj wtyczek.

W większości przypadków potrzebujesz tylko biblioteki i być może interfejsu użytkownika. Jeśli uprościsz to, na dłuższą metę będziesz w stanie utrzymać kod. Nie wszystkie wtyczki są obsługiwane i obsługiwane, w rzeczywistości większość nie. Jeśli możesz naśladować funkcjonalność za pomocą podstawowych elementów, zdecydowanie ją polecam.

Wtyczki można łatwo wstawić do kodu, oszczędzając trochę czasu, ale kiedy potrzebujesz czegoś dodatkowego, modyfikowanie ich jest kiepskie, ponieważ tracisz możliwe aktualizacje. Oszczędność czasu na początku stracisz później na zmianie przestarzałych wtyczek.

Wybierz mądrze używane wtyczki. Oprócz biblioteki i interfejsu użytkownika stale używam $ .cookie , $ .form , $ .validate i thickbox . Co do reszty, głównie tworzę własne wtyczki.

Elzo Valugi
źródło
2
Co z siatką? Zrobisz własny?
jmav
tak. od projektu do danych projektu odbywa się na różne sposoby. Wolę mieć pełną kontrolę, że uświadomienie sobie, że ta siatka pomaga mi tylko do połowy, a potem muszę improwizować.
Elzo Valugi
JEŻELI {biorąc pod uwagę wystarczającą ilość czasu, generalnie wolę napisać bezpośrednio cały kod do manipulacji danymi (css / html). innymi słowy - nie przesyłaj danych do „wtyczki” i niech wyrzuca HTML. wystarczająco trudno jest ocenić (środek) wtyczek pod kątem bieżącej zgodności zakresu, zapomnij o przyszłych wymaganiach. pomyśl ... projektantów, planistów, menedżerów, menedżerów, menedżerów. och, klienci i użytkownicy. ale jeśli macie te wszystkie rzeczy, nie będziecie mieli wystarczająco dużo czasu. więc po prostu skorzystaj z jqgrid - marnujesz czas na zastanawianie się. czy to już zrobione?}
user406905
22

Pitfall: Używanie pętli zamiast selektorów.

Jeśli okaże się, że sięgasz po metodę jQuery '.each' w celu iteracji elementów DOM, zastanów się, czy możesz użyć selektora, aby uzyskać elementy zamiast tego.

Więcej informacji na temat selektorów jQuery:
http://docs.jquery.com/Selectors

Pitfall: NIE przy użyciu narzędzia takiego jak Firebug

Firebug został praktycznie stworzony do tego rodzaju debugowania. Jeśli masz zamiar bawić się w DOM za pomocą Javascript, potrzebujesz dobrego narzędzia, takiego jak Firebug, aby zapewnić Ci widoczność.

Więcej informacji o Firebug: http://getfirebug.com/

Inne świetne pomysły znajdują się w tym odcinku podcastu polimorficznego: (jQuery Secrets with Dave Ward) http://polymorphicpodcast.com/shows/jquery/

Dan Esparza
źródło
1
Zrobiłem pierwszy raz wiele razy. Trzeba tylko pamiętać, że większość funkcji jQuery będzie działać na wszystkich elementach zwróconych z selektora.
DisgruntledGoat
Szczerze mówiąc, nie lubię metody .each
Simon Hayter
14

Nieporozumienie dotyczące używania tego identyfikatora we właściwym kontekście. Na przykład:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

A tutaj jedna z próbek, jak możesz to rozwiązać:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});
Artem Barger
źródło
1
+1 Bardziej problem z javascript niż problem z jquery, ale często mnie to potknęło.
mmacaulay 14.04.10
13

Unikaj przeszukiwania całego DOM kilka razy. Jest to coś, co naprawdę może opóźnić twój skrypt.

Zły:

$(".aclass").this();
$(".aclass").that();
...

Dobry:

$(".aclass").this().that();

Zły:

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

Dobry:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();
googletorp
źródło
2
$ (". aclass"). this (). that (); Nie jest dobrze! selektory tylko klasowe są powolne
redsquare
Jest to ilustrujący przykład pokazujący zdolność Jquery do użycia kilku metod w jednym zaznaczeniu. Uczyniłem wybór prostym (a więc powolnym), aby bardziej skupić się na tej technice.
googletorp,
10
Dobrym rozwiązaniem jest unikanie wielokrotnego przeszukiwania DOM - ostatnim przykładem jest nieczytelny bałagan, w którym nie mam pojęcia, co się dzieje. Jeśli planujesz użyć wyniku pobierania wiele razy, zapisz go w zmiennej. Dzięki temu kod jest znacznie łatwiejszy w utrzymaniu.
Quentin,
12

Zawsze buforuj $ (this) do znaczącej zmiennej, szczególnie w .each ()

Lubię to

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})
adardesign
źródło
12
Użyj $selflub $thisjeśli jesteś zbyt leniwy, aby wymyślić dobrą nazwę zmiennej.
gradbot
10

Podobne do tego, co powiedział Repo Man, ale nie do końca.

Podczas tworzenia formularzy Win ASP.NET często to robię

$('<%= Label1.ClientID %>');

zapominając o znaku #. Prawidłowa forma to

$('#<%= Label1.ClientID %>');
Ron
źródło
10

Wydarzenia

$("selector").html($("another-selector").html());

nie klonuje żadnego z wydarzeń - musisz je ponownie powiązać.

Zgodnie z komendą JP - clone () ponownie wiąże zdarzenia, jeśli przejdziesz true.

Chris S.
źródło
4
Funkcja Clone () działa, jeśli zdasz true.
James
Co z live () w jQuery 1.3.2?
jmav
9

Unikaj wielokrotnego tworzenia tych samych obiektów jQuery

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}
redsquare
źródło
var $ this = $ (this) .fadeIn () ;? buforujesz efekt?
Jason
12
zwraca element, To się nazywa łączenie!
redsquare
możesz ustawić zmienną i jednocześnie wykonać na niej akcję?
Jason
1
Rzeczywiście, ale nie wierz mi na słowo. Spróbuj. Jak myślisz, w jaki sposób możliwe jest, jeśli obiekt jquery reprezentujący element nie zostanie zwrócony? $ ('# divId'). hide (). show (). fadeIn () .... etc
redsquare
14
To działa, ale myślę, że bardziej czytelne jest mieć $this = $(this);osobną linię. Jeśli możesz (bez bałaganu), zapomnij o wszystkim $thisi po prostu $(this).fadeIn().fadeIn();
połącz
8

Mówię to również dla JavaScript, ale jQuery, JavaScript NIGDY nie powinna zastępować CSS.

Upewnij się także, że witryna nadaje się dla osób, które mają wyłączoną obsługę JavaScript (dziś nie jest tak aktualna jak w przeszłości, ale zawsze miło jest mieć w pełni użyteczną stronę).

Martin
źródło
6

Robienie zbyt wielu manipulacji DOM. Chociaż metody .html (), .append (), .prepend () itd. Są świetne, ze względu na sposób, w jaki przeglądarki renderują i renderują strony, ich zbyt częste używanie spowoduje spowolnienie. Często lepiej jest utworzyć HTML jako ciąg znaków i dołączyć go do DOM jeden raz, zamiast wielokrotnie zmieniać DOM.

Zamiast:

var $parent = $('#parent');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $parent.append($div);
}

Spróbuj tego:

var $parent = $('#parent');
var iterations = 10;
var html = '';

for (var i = 0; i < iterations; i++){
    html += '<div class="foo-' + i + '"></div>';
}

$parent.append(html);

Lub nawet to ($ wrapper to nowo utworzony element, który nie został jeszcze wstrzyknięty do DOM. Dołączanie węzłów do tego div div otoki nie powoduje spowolnienia, a na końcu dodajemy $ wrapper do $ parent, używając tylko jednej manipulacji DOM ):

var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $wrapper.append($div);
}

$parent.append($wrapper);
Alex Heyd
źródło
+1 ... Używam .html () na wielu elementach co sekundę. Zauważyłem, że wszystko zaczyna spowalniać!
Użytkownik2
5

Użycie ClientID do uzyskania „rzeczywistego” identyfikatora kontroli w projektach ASP.NET.

jQuery('#<%=myLabel.ClientID%>');

Ponadto, jeśli używasz jQuery w SharePoint, musisz wywołać jQuery.noConflict ().

Jacobs Data Solutions
źródło
11
? Jak to jest pułapka? Jest to obejście dla zachowania ASP.NET.
SolutionYogi
1
Tak. To nie jest problem jQuery. Jest to wina formularzy internetowych asp.net.
redsquare
3
Zgoda. Ale jest to coś, o czym należy pamiętać, używając jQuery w programie ASP.NET bez względu na to.
Jacobs Data Solutions
2
OP nie wspomniał o asp.net
redsquare
4

Przekazywanie identyfikatorów zamiast obiektów jQuery do funkcji:

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

Przekazywanie zapakowanego zestawu jest znacznie bardziej elastyczne:

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.
Craig Stuntz
źródło
3

Nadmierne stosowanie łańcuchów.

Zobacz:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

Wyjaśnienie

SolutionYogi
źródło
1
Wygląda śmiesznie, to rodzaj zaciemnienia.
Dykam
6
Łańcuch (sam w sobie) jest trudny w użyciu „w nadmiarze”. Wygląda na to, że ten kod nadmiernie wykorzystuje trójskładnikowy operator javascript. Zobacz en.wikipedia.org/wiki/Ternary_operation#JavaScript aby uzyskać więcej informacji.
Dan Esparza
3
Cieszę się, że nie muszę utrzymywać twojego kodu.
cdmckay
3

Używaj strun w stylu akumulatorowym

Za pomocą operatora + tworzony jest nowy ciąg w pamięci i przypisywana mu jest połączona wartość. Dopiero potem wynik jest przypisywany do zmiennej. Aby uniknąć zmiennej pośredniej dla wyniku konkatenacji, możesz bezpośrednio przypisać wynik za pomocą operatora + =. Powolny:

a += 'x' + 'y';

Szybciej:

a += 'x';
a += 'y';

Operacje pierwotne mogą być szybsze niż wywołania funkcji

Rozważ zastosowanie alternatywnej operacji pierwotnej nad wywołaniami funkcji w pętlach i funkcjach krytycznych pod względem wydajności. Powolny:

var min = Math.min(a, b);
arr.push(val);

Szybciej:

var min = a < b ? a : b;
arr[arr.length] = val;

Przeczytaj więcej na temat najlepszych praktyk dotyczących wydajności JavaScript

Pir Abdul
źródło
1

Jeśli chcesz, aby użytkownicy widzieli encje html w swojej przeglądarce, użyj „html” zamiast „text”, aby wstrzyknąć ciąg znaków Unicode, na przykład:

$('p').html("Your Unicode string")
Patrick J. Anderson
źródło
1

moje dwa centy)

Zazwyczaj praca z jquery oznacza, że ​​nie musisz martwić się o elementy DOM przez cały czas. Możesz napisać coś takiego - $('div.mine').addClass('someClass').bind('click', function(){alert('lalala')})- a ten kod zostanie wykonany bez zgłaszania błędów.

W niektórych przypadkach jest to przydatne, w niektórych przypadkach - wcale, ale faktem jest, że jquery jest zazwyczaj przyjazna dla pustych dopasowań. Jeszcze,replaceWith błąd, jeśli spróbuje się go użyć z elementem, który nie należy do dokumentu. Uważam to za raczej sprzeczne z intuicją.

Inną pułapką jest, moim zdaniem, kolejność węzłów zwróconych metodą prevAll () - $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). Właściwie to nic wielkiego, ale powinniśmy pamiętać o tym fakcie.

shabunc
źródło
0

Jeśli planujesz Ajax z dużą ilością danych, na przykład 1500 wierszy tabeli z 20 kolumnami, to nawet nie myśl o użyciu jQuery do wstawienia tych danych do kodu HTML. Użyj zwykłego JavaScript. jQuery będzie działał zbyt wolno na wolniejszych komputerach.

Ponadto, połowę czasu jQuery zrobi rzeczy, które spowodują, że będzie wolniejszy, jak na przykład parsowanie tagów skryptowych w przychodzącym HTML i radzenie sobie z dziwactwami przeglądarki. Jeśli chcesz szybko wstawiać, trzymaj się zwykłego JavaScript.

mkoryak
źródło
1
-1 .html () działa tak samo szybko, jak podejście natywne
cllpse
wszyscy, którzy mnie oddają, najwyraźniej nie próbowali wstawiać tony DOM w IE i patrzeć, jak sprawy zwalniają. Powodem, że jquery jest powolne, ponieważ nie po prostu wstawi dom, robi kilka innych rzeczy, takich jak sprawdzenie, czy dom ma skrypty i wykonuje je, jeśli jest w IE, i kilka innych rzeczy, których nie musisz robić, jeśli dokładnie wiesz jakie dane wstawiasz
mkoryak
1
Tak długo, jak nie musisz się martwić przeciekami przeglądarki i tak się .innerHTMLstanie. Ale jeśli budujesz coś takiego jak Gmail, w którym użytkownik utrzymuje kartę otwartą przez wiele godzin, będziesz musiał po prostu ugryźć kulę i poradzić sobie z dodatkową powolnością. Dla ciekawskich, oto dokładnie to, co .html()robi jQuery : james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev
-1

Korzystanie z jQuery w małym projekcie, który można ukończyć za pomocą zaledwie kilku wierszy zwykłego JavaScript.

67%
źródło
Nie mam nic przeciwko zmniejszeniu, ale proszę, uzasadnij swój wybór.
imadło
8
-1 jQuery wyodrębnia uszkodzony interfejs API. W ten sposób masz pewność, że Twój kod działa. Załóżmy, że napisałeś trochę kodu za pomocą jQuery i jakiś przypadkowy błąd przeglądarki został wprowadzony z nową wersją - wystarczy zaimportować zaktualizowaną wersję frameworka jQuery. W przeciwieństwie do samodzielnego rozwiązywania problemu.
cllpse
+1 wydaje mi się rozsądne - jeśli używasz tylko kilku linii, warto po prostu użyć waniliowej JS.
alex
1
@roosteronacid, twój argument nie ma sensu. Jest bardzo mało prawdopodobne, aby przeglądarka wprowadziła regresję w skrypcie o mniejszej złożoności lub zajmowała się w tej kwestii problemami z przeglądarką. Dwa lata temu pracowałem z mootools i pod pewnymi warunkami nie był w stanie odczytać zawartości elementów w IE. Po kilku godzinach próbowania rozwiązania problemu po prostu przepisałem tę część zwykłym js. Tak więc bardziej prawdopodobne jest, że jQuery się zepsuje, niż zwykły javascript, do awarii z powodu aktualizacji przeglądarki. Rozwiązałbym błąd każdego dnia, zamiast hakować kod bibliotek.
imadło
3
couple of lines of ordinary JavaScriptPewnie nie ma problemu. Ale kiedy to jest właśnie to? Ludzie, którzy mówią „dlaczego nie używać javascript waniliowy?” nie został jeszcze wystarczająco ugryziony przez IE ... i nie wspominając o tym, ile kodu cruft i bojlerów musisz napisać, aby robić proste rzeczy w zwykłym starym JS.
adamJLev
-3

Niezrozumienie wiążącego zdarzenia. JavaScript i jQuery działają inaczej.

Według popularnego zapotrzebowania przykład:

W jQuery:

$("#someLink").click(function(){//do something});

Bez jQuery:

<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
    //do something
}
</script>

Zasadniczo haki wymagane dla JavaScript nie są już potrzebne. Korzystam z wbudowanych znaczników (onClick itp.), Ponieważ możesz po prostu użyć identyfikatorów i klas, które programista zwykle wykorzystuje do celów CSS.

Jason
źródło
5
Możesz rozwinąć temat? Najlepiej przykład?
SolutionYogi
7
Czy JavaScript nie udostępnia do tego funkcji addEventListener () i attachEvent ()?
alex
2
oddzielenie obaw, człowieku. Trzymaj HTML i JS osobno
Don