Ich habe einige davon:
function addEventsAndStuff() {
// bla bla
}
addEventsAndStuff();
function sendStuffToServer() {
// send stuff
// get HTML in response
// replace DOM
// add events:
addEventsAndStuff();
}
Das erneute Hinzufügen der Ereignisse ist erforderlich, da sich das DOM geändert hat und zuvor angehängte Ereignisse nicht mehr vorhanden sind. Da sie anfangs auch angebracht werden müssen (duh), haben sie eine gute Funktion, um trocken zu sein.
An diesem Setup ist nichts auszusetzen (oder gibt es das?), Aber kann ich es ein wenig glätten? Ich möchte die addEventsAndStuff()
Funktion erstellen und sofort aufrufen, damit sie nicht so amateurhaft aussieht.
Beide folgenden antworten mit einem Syntaxfehler:
function addEventsAndStuff() {
alert('oele');
}();
(function addEventsAndStuff() {
alert('oele');
})();
Irgendwelche Abnehmer?
javascript
function
Rudie
quelle
quelle
Antworten:
An dem Beispiel, das Sie in Ihrer Frage gepostet haben, ist nichts auszusetzen. Die andere Vorgehensweise mag seltsam aussehen, aber:
Es gibt zwei Möglichkeiten, eine Funktion in JavaScript zu definieren. Eine Funktionsdeklaration:
und eine Funktion zum Ausdruck, das ist eine beliebige Art und Weise eine andere Funktion als die oben definieren:
...etc
Funktionsausdrücke können benannt werden, aber ihr Name wird nicht an den enthaltenen Bereich weitergegeben. Das heißt, dieser Code ist gültig:
aber das ist nicht:
Um Ihre Funktion zu benennen und sofort aufzurufen, müssen Sie eine lokale Variable definieren, Ihre Funktion als Ausdruck zuweisen und dann aufrufen.
quelle
call()
Methode von hier aus verwenden: stackoverflow.com/a/12359154/1231001Hierfür gibt es eine gute Abkürzung (es müssen keine Variablen deklariert werden, außer für die Zuweisung der Funktion):
quelle
r
wird die Funktion zurückgeben? Dasfunction r
oder dasvar r
? Nur neugierig. Gute Lösung. Musste aber nicht ein Ort sein =)return r
wäre das gewesen,function r
wie es der Umfang war. Ich habe Scala so permanent geschrieben, dass ich versucht habe, etwas online zu bringen.Verwenden Sie stattdessen die Ereignisdelegierung. Dort suchen Sie tatsächlich nach dem Ereignis in einem Container, der nicht verschwindet, und verwenden dann
event.target
(oderevent.srcElement
im Internet Explorer), um herauszufinden, wo das Ereignis tatsächlich aufgetreten ist, und es korrekt zu behandeln.Auf diese Weise hängen Sie die Handler nur einmal an und sie funktionieren auch dann weiter, wenn Sie Inhalte austauschen.
Hier ist ein Beispiel für die Ereignisdelegierung ohne Verwendung von Hilfsbibliotheken:
Live Beispiel
Beachten Sie, dass beim Klicken auf die Nachrichten, die dynamisch zur Seite hinzugefügt werden, Ihr Klick registriert und verarbeitet wird, obwohl kein Code zum Verknüpfen von Ereignissen mit den neu hinzugefügten Absätzen vorhanden ist. Beachten Sie auch, dass Ihre Handler nur Einträge in einer Karte sind und Sie einen Handler auf dem haben
document.body
, der den gesamten Versand erledigt. Nun, Sie wurzeln dies wahrscheinlich in etwas gezielterem alsdocument.body
, aber Sie bekommen die Idee. Im obigen Abschnitt versenden wir grundsätzlich nachid
, aber Sie können das Matching so komplex oder einfach durchführen, wie Sie möchten.Moderne JavaScript-Bibliotheken wie jQuery , Prototype , YUI , Closure oder eine von mehreren anderen sollten Funktionen zur Ereignisdelegierung bieten, um Browserunterschiede auszugleichen und Randfälle sauber zu behandeln. jQuery bietet sowohl seine
live
als auch seinedelegate
Funktionen, mit denen Sie Handler mit einer ganzen Reihe von CSS3-Selektoren (und noch einige mehr) angeben können.Hier ist zum Beispiel der entsprechende Code, der jQuery verwendet (außer ich bin sicher, dass jQuery Randfälle behandelt, die in der obigen Rohversion ohne Manschette nicht behandelt werden):
Live-Kopie
quelle
Event.target
, weil das nicht immer das richtige Ziel ist. Das stimmt. Wenn Sie auf einIMG
innerhalb eines klickenDIV
und dasDIV
Ereignis hat,Event.target
wird das seinIMG
und es gibt keine Möglichkeit, dasDIV
Objekt schön zu bekommen . bearbeiten Btw ich hasse jQuery.live
‚Ereignis‘event.target
: Was du beschreibst, ist nicht falsch, es ist richtig. Wenn Sie auf einimg
innerhalb von a klickendiv
und das beobachtendiv
,event.target
ist dasimg
(undthis
ist dasdiv
). Schauen Sie sich das oben noch einmal an. Sie können an jedem Punkt in der Kette einen Handler zwischen dem angeklickten Element (img
z. B. dem) und dem Element, das Sie beobachten (oben ganz untendocument.body
), anhängen . Relive
: Ich bevorzuge sehrdelegate
die geschlossenere Version vonlive
. Ich habe eslive
oben verwendet, weil es dem am nächsten kam, was ich im Rohbeispiel getan hatte. Beste,Möglicherweise möchten Sie eine Hilfsfunktion wie folgt erstellen:
quelle
Ihr Code enthält einen Tippfehler:
so
funktioniert. Prost!
[ bearbeiten ] basierend auf Kommentar: und dies sollte ausgeführt werden und die Funktion auf einmal zurückgeben:
quelle
ReferenceError
Mit ES6 noch einfacher:
quelle
concat_two
funktioniert perfekt, ABER es definiert es immer im globalen Bereich, so dass es nicht funktioniert"use strict"
. Das ist für mich nicht wichtig, aber es ist ein kleiner Nachteil.Wenn Sie eine Funktion erstellen und sofort ausführen möchten -
quelle
Versuchen Sie es so:
quelle
var foo = (function() {...})();
ruft aber die Funktion vor der Zuweisung auf. Die Klammer muss die Zuordnung enthalten. (Sie möchten zuweisen, dann anrufen.)