jQuery Fallstricke zu vermeiden [geschlossen]

210

Ich starte ein Projekt mit jQuery.

Welche Fallstricke / Fehler / Missverständnisse / Missbräuche / Missbräuche hatten Sie in Ihrem jQuery-Projekt?

Flybywire
quelle
4
Dies sollte nicht geschlossen worden sein, um "nicht konstruktiv" zu sein. Einige sehr hilfreiche Antworten sind eingetroffen und die Frage wurde jetzt 220 Mal mit einem Stern versehen. Bitte stimmen Sie ab, um wieder zu öffnen, wenn Sie genügend Karma haben.
Roy Prins
Mir scheint, jQuery ist eine Falle für sich
gromit190

Antworten:

189

Sich des Leistungseinbruchs nicht bewusst sein und Selektoren überbeanspruchen, anstatt sie lokalen Variablen zuzuweisen. Beispielsweise:-

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

Eher, als:-

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

Oder noch besser mit Verkettung : -

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

Ich fand dies der aufschlussreiche Moment, als mir klar wurde, wie die Anrufstapel funktionieren.

Bearbeiten: Vorschläge in Kommentare aufgenommen.

Gavin Gilmour
quelle
16
+1 für den Youtube-Link. Heiliger Mist, ich habe viel gelernt.
Jason
23
Ich finde es großartig, lokalen Variablen Dinge zuzuweisen, aber vergessen Sie nicht die Fähigkeit der Verkettung (aus Ihrem Beispiel): $ ("# label"). Method (). Method2 (). CSS ("Hintergrundfarbe", " rot");
Lance McNearney
Das YouTube-Video war großartig. Ich habe andere Google-Präsentationen zu diesem Thema gesehen und noch ein paar Dinge gelernt! Vielen Dank!
Gabriel Hurley
+1 auch für den Link, ausgezeichnet!
Josh Stodola
7
Es ist eine Art Konvention, ein Dollarzeichen für Variablen mit jQuery-Kontext zu verwenden. Vielleicht möchten Sie schreibenvar $label = $('#label');
Tim Büthe
90

Verstehen Sie, wie Sie den Kontext verwenden. Normalerweise durchsucht ein jQuery-Selektor das gesamte Dokument:

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

Sie können die Dinge jedoch beschleunigen, indem Sie in einem Kontext suchen:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
Slolife
quelle
9
Aaaaaaah! Nun, das sind ungefähr 1.000.000 meiner Fehler, die behoben wurden. +1
Jammus
4
Es scheint, dass Ihr letzter Punkt falsch ist - groups.google.co.uk/group/jquery-dev/browse_thread/thread/…
James
1
Vielen Dank für den Hinweis auf JP. Was ist jetzt zu tun? Soll ich meine Antwort löschen, damit niemand sonst wild wird und seinen Code umsonst ändert?
Slolife
Nein, es ist immer noch ein guter Punkt, was die Optimierung betrifft. :)
James
2
jQuery prüft, ob der Kontext ein Instanz von jQuery ist, daher gibt es keinen Grund dafür [0]. $('.myClass', ct);oder wenn Sie wissen, dass ct eine Instanz von jQuery ist, können Sie findct.find(".myClass")
gradbot
62

Verwenden Sie keine bloßen Klassenselektoren wie diese:

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

Dies wird am Ende jedes einzelne Element untersuchen, um festzustellen, ob es eine Klasse von "Schaltflächen" hat.

Stattdessen können Sie helfen, wie:

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

Das habe ich letztes Jahr aus Rebecca Murphys Blog gelernt

Update - Diese Antwort wurde vor über 2 Jahren gegeben und ist für die aktuelle Version von jQuery nicht korrekt . Einer der Kommentare enthält einen Test, um dies zu beweisen. Es gibt auch eine aktualisierte Version des Tests , die die Version von jQuery zum Zeitpunkt dieser Antwort enthält.

BrianH
quelle
6
Ich hatte auch den Eindruck, dass das Gegenteil der Fall ist. Möglicherweise ist dies in Browsern der Fall, die getElementsByClassName nicht implementieren, aber ansonsten geben Sie jQuery nur mehr Arbeit. Ich würde sehr gerne sehen, wie Rebecca einige Benchmarks veröffentlicht :)
Alex Barrett
7
Sie reduzieren den Arbeitsaufwand. Es ist, als würde man jemandem sagen, er solle seine Socken aus der Schublade Ihrer Kommode holen, anstatt ihm zu sagen, er solle die Socken aus dem Zimmer holen. Reduziert die Menge an "Suchen", die es zu tun hat, erheblich.
Sneakyness
4
Das Gegenteil ist der Fall, wenn Sie CSS schreiben (zumindest einschließlich des Element-Tags). Siehe code.google.com/speed/page-speed/docs/…
kmiyashiro
7
@Sneakyness Nicht alles hat ein genaues Analogon zum wirklichen Leben. Könnte beispielsweise $('.b')verwendet werden, document.getElementsByClassName('b')wenn der Browser dies unterstützt. Wenn Sie dies jedoch tun, $('a.b')werden alle übereinstimmenden Elemente mit der Klasse babgerufen und anschließend bestätigt, dass es sich um Anker in einem zweistufigen Vorgang handelt. Letzteres klingt für mich nach mehr Arbeit. Versuchen Sie
Alex
2
Ich glaube, das Missverständnis bei Selektoren beruht auf der Tatsache, dass es in älteren Versionen von jquery schneller war, $ ('# foo') als $ ('div # foo') zu tun, da eine ID per Definition eindeutig ist. Ich bin mir ziemlich sicher, dass dies in späteren Versionen behoben wurde, aber diese Empfehlung galt nur für IDs, nicht für andere Arten von Selektoren
Alex Heyd
35

Versuchen Sie, anonyme Funktionen aufzuteilen, damit Sie sie wiederverwenden können.

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

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

$('#div').click( divClickFn );
rotes Quadrat
quelle
19
Ich denke, dies gilt ungefähr in dem Maße, in dem synchroner (Inline-) Code in benannte Funktionen aufgeteilt werden sollte. Wenn Sie einen Teil des Codes haben, der darum bittet, einen Namen zu erhalten, dann versuchen Sie es. Verschieben Sie den Code jedoch nicht aus der Zeile, nur weil Sie ihn in eine Funktion einschließen. anonyme Funktionen existieren aus gutem Grund.
Dan Breslau
4
Eigentlich mag ich es, meiner Funktion einen Namen zu geben. Dies ist sehr nützlich, wenn Sie den Code debuggen und statt einer endlosen Liste anonymer Funktionen richtig benannte Funktionen sehen.
SolutionYogi
1
Ihr Standpunkt ist gut aufgenommen, und ich bin wahrscheinlich selbst ein paar Mal davon gestolpert. Trotzdem funktioniert " ungefähr der gleiche Grad" immer noch für mich.
Dan Breslau
1
insb. wenn die Bindung in einer Schleife stattfindet!
Daniellmb
Benannte Funktionen kommen Ihnen auch beim Debuggen sehr zugute. Nichts ist mehr zum Kotzen, als einen 8 Ebenen tiefen Callstack zu betrachten, der nichts anderes hat als (anonymous). Lesen Sie mehr über diesen Tipp hier: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
Ken
34
  • Vermeiden Sie den Missbrauch von Dokumenten.
  • Halten Sie das Dokument nur für die Initialisierung von Code bereit.
  • Extrahieren Sie Funktionen immer außerhalb des Dokuments, damit sie wiederverwendet werden können.

Ich habe Hunderte von Codezeilen in der doc ready-Anweisung gesehen. Hässlich, unlesbar und unmöglich zu pflegen.

Peter Mortensen
quelle
6
+1. Im Allgemeinen verwendet der größte Teil des jQuery-Codes, den ich gesehen habe, Funktionen mit Hunderten von Zeilen. Ich weiß nicht, warum 'jQuery-Entwickler' kleinere Funktionen nicht gerne verwenden.
SolutionYogi
6
@SolutionYogi weil die meisten nur JS Noobs sind?
AdamJLev
Ich bin alles dafür, dass ich nicht sehr lange Funktionen in Dokumente bereitstelle, das ist ein guter Rat. Es ist jedoch nicht unbedingt die beste Vorgehensweise, viele kleine Komponentenfunktionen zu erstellen, die von einer übergreifenden Funktion ausgeführt werden, die nicht dokumentbereit ist. Wenn die übergeordnete Funktion die einzige ist, die diese Codeteile verwendet, ist es besser, alles in einer Funktion zusammenzufassen, auch wenn es schwieriger zu lesen ist. Das Aufrufen von Funktionen ist mit viel Aufwand verbunden. Wenn Sie den Code nur in einem Kontext verwenden, sollte dies vermieden werden.
sage88
34

Wenn Sie die $.ajaxFunktion für Ajax- Anforderungen an den Server verwenden, sollten Sie vermeiden, das completeEreignis zum Verarbeiten von Antwortdaten zu verwenden. Es wird ausgelöst, ob die Anforderung erfolgreich war oder nicht.

Anstatt zu completeverwenden success.

Siehe Ajax-Ereignisse in den Dokumenten.

Patrick McElhaney
quelle
1
Ich war hin und her in Bezug auf Erfolg und Vollständigkeit. Können Sie erläutern, warum Vollständigkeit Ihrer Meinung nach besser ist?
Neil N
1
Ich sage nicht, dass vollständig besser ist. Was ich damit sagen wollte, ist, dass Sie die irreführende Verwendung von complete vermeiden müssen und Erfolg haben sollten, um die Antwortdaten verarbeiten zu können.
Artem Barger
2
Nun, es wird immer gerufen. Ich würde jedoch nicht zustimmen. Vollständig ist am besten geeignet, um ein Lade-GIF usw. auszublenden. Sie sollten den Erfolg für die Behandlung der Antwort und den Fehler natürlich für alle Fehler verwenden.
Redsquare
1
Er schlägt vor, Erfolg statt Vollständigkeit zu verwenden. 'complete' wird immer ausgelöst, wenn die Ajax-Anforderung 'complete' ist, unabhängig davon, ob sie erfolgreich oder erfolglos abgeschlossen wurde.
SolutionYogi
@redsquare, kannst du genau das erweitern, mit dem du nicht einverstanden bist? Ich bezog mich auf den Datenprozess und hatte nichts dagegen, dass Bilder Möglichkeiten verbergen / zeigen, die Sie mit dem vollständigen Handler haben.
Artem Barger
24

Animationsereignisse mit Callbacks "verketten".

Angenommen, Sie möchten einen Absatz animieren, der beim Klicken verschwindet. Sie wollten das Element anschließend auch aus dem DOM entfernen. Sie denken vielleicht, Sie können die Methoden einfach verketten:

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

In diesem Beispiel wird .remove () aufgerufen, bevor .fadeOut () abgeschlossen ist, wodurch Ihr allmählicher Fading-Effekt zerstört wird und das Element einfach sofort verschwindet. Wenn Sie einen Befehl erst nach Abschluss des vorherigen Befehls auslösen möchten, verwenden Sie stattdessen die folgenden Rückrufe:

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

Der zweite Parameter von .fadeOut () ist eine anonyme Funktion, die ausgeführt wird, sobald die .fadeOut () -Animation abgeschlossen ist. Dies führt zu einem allmählichen Ausbleichen und einem anschließenden Entfernen des Elements.

Sampson
quelle
24

Wenn Sie dasselbe Ereignis mehrmals binden (), wird es mehrmals ausgelöst. Normalerweise gehe ich immer unbind('click').bind('click')nur, um in Sicherheit zu sein

Scott Evernden
quelle
2
Dies ist nicht spezifisch für jQuery, obwohl es wichtig ist, dies zu beachten.
SolutionYogi
11
Sie können Live-Ereignisse verwenden, um dasselbe Ereignis nicht zweimal binden zu müssen.
Powerlord
Live hat seine eigenen (Leistungs-) Probleme, wenn es zu viel verwendet wird. Besser in 1.3.3, wo Sie Kontext geben können.
Redsquare
23

Missbrauche Plug-Ins nicht.

Meistens benötigen Sie nur die Bibliothek und möglicherweise die Benutzeroberfläche. Wenn Sie es einfach halten, ist Ihr Code auf lange Sicht wartbar. Nicht alle Plug-Ins werden unterstützt und gewartet, die meisten jedoch nicht. Wenn Sie die Funktionalität mithilfe von Kernelementen nachahmen können, empfehle ich sie dringend.

Plug-Ins lassen sich leicht in Ihren Code einfügen, sparen Zeit, aber wenn Sie etwas extra benötigen, ist es eine schlechte Idee, sie zu ändern, da Sie die möglichen Updates verlieren. Die Zeit, die Sie zu Beginn sparen, verlieren Sie später beim Ändern veralteter Plug-Ins.

Wählen Sie die Plug-Ins mit Bedacht aus. Abgesehen von Bibliothek und Benutzeroberfläche verwende ich ständig $ .cookie , $ .form , $ .validate und Thickbox . Im Übrigen entwickle ich meistens meine eigenen Plugins.

Elzo Valugi
quelle
2
Was ist mit Gitter? Du machst deine eigenen?
jmav
Ja. Von Projekt zu Projektdaten gibt es verschiedene Möglichkeiten. Ich bevorzuge die volle Kontrolle darüber, dass das Erkennen dieses Gitters mir nur in die Mitte hilft und ich dann improvisieren muss.
Elzo Valugi
WENN {genügend Zeit zur Verfügung steht, schreibe ich im Allgemeinen lieber den gesamten Code für datengesteuerte Dom-Manipulation (CSS / HTML) direkt. Mit anderen Worten: Übergeben Sie keine Daten an ein 'Plugin' und lassen Sie es HTML spucken. Es ist schwierig genug, (das Mittelfeld von) Plugins auf ihre aktuelle Kompatibilität mit dem Gültigkeitsbereich zu prüfen. Vergessen Sie die zukünftigen Anforderungen. Denken Sie ... Designer, Planer, Manager, Manager, Manager. Oh und Kunden und Benutzer. Aber wenn Sie all diese Dinge haben, werden Sie nicht genug von der besagten "Zeit" haben. Verwenden Sie also einfach bereits jqgrid - Sie verschwenden Zeit mit Überlegungen. ist es schon fertig?}
user406905
22

Fallstricke: Verwenden von Schleifen anstelle von Selektoren.

Wenn Sie nach der jQuery-Methode '.each' greifen, um über DOM-Elemente zu iterieren, fragen Sie sich, ob Sie stattdessen einen Selektor verwenden können, um die Elemente abzurufen.

Weitere Informationen zu jQuery-Selektoren:
http://docs.jquery.com/Selectors

Fallstricke: NICHT mit einem Tool wie Firebug

Firebug wurde praktisch für diese Art des Debuggens entwickelt. Wenn Sie mit Javascript im DOM herumspielen wollen, benötigen Sie ein gutes Tool wie Firebug, um sichtbar zu werden.

Weitere Informationen zu Firebug: http://getfirebug.com/

Weitere großartige Ideen finden Sie in dieser Episode des polymorphen Podcasts: (jQuery Secrets mit Dave Ward) http://polymorphicpodcast.com/shows/jquery/

Dan Esparza
quelle
1
Ich habe den ersten schon oft gemacht. Sie müssen sich nur daran erinnern, dass die meisten jQuery-Funktionen für alle von einem Selektor zurückgegebenen Elemente ausgeführt werden.
DisgruntledGoat
Ich mag die .each-Methode nicht, um ehrlich zu sein
Simon Hayter
14

Missverständnis der Verwendung dieser Kennung im richtigen Kontext. Zum Beispiel:

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

Und hier eines der Beispiele, wie Sie es lösen können:

$( "#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
quelle
1
+1 Eher ein Javascript-Problem als ein JQuery-Problem, aber ich bin oft darüber gestolpert.
mmacaulay
13

Vermeiden Sie es, das gesamte DOM mehrmals zu durchsuchen. Dies kann Ihr Skript wirklich verzögern.

Schlecht:

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

Gut:

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

Schlecht:

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

Gut:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();
googletorp
quelle
2
$ (". aclass"). this (). that (); ist nicht gut! Nur-Klassen-Selektoren sind langsam
redsquare
Es ist ein anschauliches Beispiel, das die Fähigkeit von Jquery zeigt, mehrere Methoden für eine Auswahl zu verwenden. Ich habe die Auswahl einfach (und damit langsam) gemacht, um mich stärker auf diese Technik zu konzentrieren.
Googletorp
10
Das wiederholte Durchsuchen des DOM ist zwar eine gute Sache - das letzte Beispiel ist ein unlesbares Durcheinander, bei dem ich keine Ahnung habe, was los ist. Wenn Sie das Ergebnis eines Abrufs mehrmals verwenden möchten, speichern Sie es in einer Variablen. Es macht Code viel wartbarer.
Quentin
12

Speichern Sie $ (this) immer in einer aussagekräftigen Variablen, insbesondere in einer .each ()

So was

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})
Adardesign
quelle
12
Verwenden Sie $selfoder, $thiswenn Sie zu faul sind, um an einen guten Variablennamen zu denken.
Gradbot
10

Ähnlich wie Repo Man, aber nicht ganz.

Bei der Entwicklung von ASP.NET-Winforms mache ich das oft

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

das # Zeichen vergessen. Die richtige Form ist

$('#<%= Label1.ClientID %>');
Ron
quelle
10

Veranstaltungen

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

Klont keines der Ereignisse - Sie müssen alle neu binden.

Gemäß JP beginnen - clone () die Ereignisse neu, wenn Sie true übergeben.

Chris S.
quelle
4
Clone () funktioniert, wenn Sie true übergeben.
James
Was ist mit live () in jQuery 1.3.2?
jmav
9

Vermeiden Sie die mehrfache Erstellung derselben jQuery-Objekte

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

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}
redsquare
quelle
var $ this = $ (this) .fadeIn ();? Sie zwischenspeichern einen Effekt?
Jason
12
es gibt das Element zurück, es heißt Verkettung!
Redsquare
Sie können eine Variable festlegen und gleichzeitig eine Aktion ausführen?
Jason
1
In der Tat, aber nimm mein Wort nicht dafür. Versuch es. Wie halten Sie Folgendes für möglich, wenn das das Element darstellende jquery-Objekt nicht zurückgegeben wird? $ ('# divId'). hide (). show (). fadeIn () .... etc
redsquare
14
Das funktioniert, aber ich denke, es ist besser lesbar, $this = $(this);in einer separaten Zeile zu haben. Wenn Sie können (ohne $this$(this).fadeIn().fadeIn();
Unordnung
8

Ich sage dies auch für JavaScript, aber jQuery, JavaScript sollte NIEMALS CSS ersetzen.

Stellen Sie außerdem sicher, dass die Site für jemanden mit deaktiviertem JavaScript verwendbar ist (heute nicht mehr so ​​relevant wie früher, aber immer schön, eine vollständig nutzbare Site zu haben).

Martin
quelle
6

Zu viele DOM-Manipulationen vornehmen. Obwohl die Methoden .html (), .append (), .prepend () usw. aufgrund der Art und Weise, wie Browser Seiten rendern und neu rendern, großartig sind, führt eine zu häufige Verwendung zu Verlangsamungen. Oft ist es besser, das HTML als Zeichenfolge zu erstellen und es einmal in das DOM aufzunehmen, als das DOM mehrmals zu ändern.

Anstatt:

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

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

Versuche dies:

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

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

$parent.append(html);

Oder auch dies ($ wrapper ist ein neu erstelltes Element, das noch nicht in das DOM eingefügt wurde. Das Anhängen von Knoten an dieses Wrapper-Div führt nicht zu Verlangsamungen, und am Ende hängen wir $ wrapper mit nur einer DOM-Manipulation an $ parent an ):

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
quelle
+1 ... Ich verwende .html () jede Sekunde für mehrere Elemente. Es wird bemerkt, dass es langsam wird!
User2
5

Verwenden der ClientID, um die "echte" ID des Steuerelements in ASP.NET-Projekten abzurufen.

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

Wenn Sie jQuery in SharePoint verwenden, müssen Sie außerdem jQuery.noConflict () aufrufen.

Jacobs Data Solutions
quelle
11
? Wie ist das eine Falle? Dies ist eine Problemumgehung für das ASP.NET-Verhalten.
SolutionYogi
1
Ja. Es handelt sich nicht um ein jQuery-Problem. Es ist ein Fehler von asp.net-Webformularen.
Redsquare
3
Einverstanden. Dies ist jedoch etwas, das Sie beachten müssen, wenn Sie jQuery in ASP.NET verwenden.
Jacobs Data Solutions
2
Das OP erwähnte asp.net
redsquare
4

Übergeben von IDs anstelle von jQuery-Objekten an Funktionen:

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

myFunc("someId");

Das Übergeben eines verpackten Sets ist weitaus flexibler:

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

myFunc($("#someId")); // or myFunc($(".someClass")); etc.
Craig Stuntz
quelle
3

Übermäßiger Gebrauch der Verkettung.

Sieh dir das an:

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

Erläuterung

SolutionYogi
quelle
1
Es sieht lustig aus, es ist eine Art Verschleierung.
Dykam
6
Verkettung (allein) ist schwierig, "im Übermaß" zu verwenden. Es sieht so aus, als würde dieser Code den ternären Javascript-Operator übermäßig verwenden. Weitere Informationen finden Sie unter en.wikipedia.org/wiki/Ternary_operation#JavaScript .
Dan Esparza
3
Ich bin froh, dass ich Ihren Code nicht pflegen muss.
CDMckay
3

Verwenden Sie Strings im Akkumulatorstil

Mit dem Operator + wird eine neue Zeichenfolge im Speicher erstellt und der verkettete Wert zugewiesen. Erst danach wird das Ergebnis einer Variablen zugeordnet. Um die Zwischenvariable für das Verkettungsergebnis zu vermeiden, können Sie das Ergebnis mit dem Operator + = direkt zuweisen. Langsam:

a += 'x' + 'y';

Schneller:

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

Primitive Operationen können schneller sein als Funktionsaufrufe

Erwägen Sie die Verwendung einer alternativen primitiven Operation über Funktionsaufrufe in leistungskritischen Schleifen und Funktionen. Langsam:

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

Schneller:

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

Weitere Informationen finden Sie unter Best Practices für die JavaScript-Leistung

Pir Abdul
quelle
1

Wenn Benutzer HTML-Entitäten in ihrem Browser sehen sollen, verwenden Sie 'html' anstelle von 'text', um eine Unicode-Zeichenfolge einzufügen, z.

$('p').html("Your Unicode string")
Patrick J. Anderson
quelle
1

meine zwei Cent)

Wenn Sie mit jquery arbeiten, müssen Sie sich normalerweise nicht ständig um die tatsächlichen DOM-Elemente kümmern. Sie können so etwas schreiben -$('div.mine').addClass('someClass').bind('click', function(){alert('lalala')}) - und dieser Code wird ohne Fehler ausgeführt.

In einigen Fällen ist dies nützlich, in einigen Fällen - überhaupt nicht, aber es ist eine Tatsache, dass jquery dazu neigt, leer-Streichhölzer-freundlich zu sein. Noch,replaceWith wird jedoch ein Fehler wenn versucht wird, ihn mit einem Element zu verwenden, das nicht zum Dokument gehört. Ich finde es eher kontraintuitiv.

Eine weitere Gefahr ist meiner Meinung nach die Reihenfolge der Knoten, die von der prevAll () -Methode zurückgegeben werden $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). Eigentlich keine große Sache, aber wir sollten diese Tatsache berücksichtigen.

shabunc
quelle
0

Wenn Sie Ajax in vielen Daten planen, z. B. 1500 Zeilen einer Tabelle mit 20 Spalten, sollten Sie nicht einmal daran denken, diese Daten mit jQuery in Ihren HTML-Code einzufügen. Verwenden Sie einfaches JavaScript. jQuery ist auf langsameren Computern zu langsam.

Außerdem erledigt jQuery die Hälfte der Zeit Dinge, die dazu führen, dass es langsamer wird, z. B. den Versuch, Skript-Tags im eingehenden HTML-Code zu analysieren und sich mit Browser-Macken zu befassen. Wenn Sie eine schnelle Einfügegeschwindigkeit wünschen, bleiben Sie bei einfachem JavaScript.

mkoryak
quelle
1
-1 Die .html () Funktion ist genauso schnell wie der native Ansatz
cllpse
Jeder, der mich abstimmt, hat offensichtlich nicht versucht, eine Menge DOM in den IE einzufügen und zu beobachten, wie die Dinge langsam werden. Grund, warum jquery langsam ist, ist, dass es nicht einfach den Dom einfügt, sondern ein paar andere Dinge tut, wie zu überprüfen, ob der Dom Skripte hat, und sie ausführt, wenn es im IE ist, und einige andere Dinge, die Sie nicht tun müssen, wenn Sie genau wissen Welche Art von Daten
fügen
1
Solange Sie sich keine Sorgen über Browserlecks und dergleichen machen müssen, reicht .innerHTMLdies aus. Wenn Sie jedoch so etwas wie Google Mail erstellen, bei dem der Benutzer den Tab stundenlang offen hält, müssen Sie nur in die Kugel beißen und sich mit der zusätzlichen Langsamkeit befassen. Für Neugierige ist hier genau das, was jQuery's .html()macht: james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev
-1

Verwenden von jQuery in einem kleinen Projekt, das mit nur wenigen Zeilen gewöhnlichem JavaScript abgeschlossen werden kann.

Schraubstock
quelle
Es macht mir nichts aus, modifiziert zu werden, aber bitte argumentieren Sie Ihre Wahl.
Schraubstock
8
-1 jQuery abstrahiert eine fehlerhafte API. Auf diese Weise sind Sie immer sicher, dass Ihr Code funktioniert. Angenommen, Sie haben Code mit jQuery geschrieben und ein zufälliger Browser-Fehler wird mit einer neuen Version eingeführt. Sie müssen lediglich eine aktualisierte Version des jQuery-Frameworks importieren. Anstatt herausfinden zu müssen, wie man den Fehler selbst löst.
cllpse
+1 erscheint mir vernünftig - wenn Sie nur ein paar Zeilen verwenden, ist es sinnvoll, nur Vanilla JS zu verwenden.
alex
1
@roosteronacid, Ihr Argument verfehlt den Punkt. Es ist sehr unwahrscheinlich, dass ein Browser eine Regression in ein Skript mit geringerer Komplexität einführt oder sich mit Crossbrowser-Problemen befasst. Vor zwei Jahren habe ich mit Mootools gearbeitet und unter bestimmten Umständen konnte es keinen Elementinhalt im IE lesen. Nach ein paar Stunden, um das Problem herauszufinden, habe ich diesen Teil einfach mit einfachem js umgeschrieben. Daher ist es tatsächlich wahrscheinlicher, dass jQuery beschädigt wird, als dass einfaches Javascript aufgrund eines Browser-Upgrades fehlschlägt. Ich würde jeden Tag selbst einen Fehler lösen, anstatt einen Bibliothekscode zu hacken.
Schraubstock
3
couple of lines of ordinary JavaScriptSicher kein Problem. Aber wann ist es jemals genau das? Leute, die sagen "warum nicht Vanille-Javascript verwenden?" Ich bin noch nicht hart genug vom IE gebissen worden ... und ganz zu schweigen davon, wie viel Cruft- und Boilerplate-Code Sie schreiben müssen, um einfache Dinge in einfachem alten JS zu tun.
AdamJLev
-3

Ereignisbindung nicht verstehen. JavaScript und jQuery funktionieren unterschiedlich.

Auf vielfachen Wunsch ein Beispiel:

In jQuery:

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

Ohne jQuery:

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

Grundsätzlich sind die für JavaScript erforderlichen Hooks nicht mehr erforderlich. Verwenden Sie also Inline-Markups (onClick usw.), da Sie einfach die IDs und Klassen verwenden können, die ein Entwickler normalerweise für CSS-Zwecke nutzen würde.

Jason
quelle
5
Möchtest du das näher erläutern? Am liebsten ein Beispiel?
SolutionYogi
7
Stellt JavaScript dazu nicht addEventListener () und attachEvent () bereit?
Alex
2
Trennung von Bedenken, Mann. Halten Sie HTML und JS getrennt
Don