Obwohl es scheint, dass dieser Code ausreichend ist und genau das tun wird, was wir wir erwarten, wird Greasemonkey im Hintergrund einige Dinge tun, um zu verhindern, dass das Script nicht schlecht mit anderen Scripten zusammen wirkt, die zur Originalseite gehören. Um genau zu sein, wird es Ihr Benuterscript autmonatisch in einem Container als anonyme Funktion ausführen. Normalerweise können Sie das ignorieren, aber eventuell wird es Sie aufhalten und in den Arsch kneifen, also sollten Sie ein bisschen darüber lernen.
Eine von den Dingen, die sie am meisten aufhalten kann, ist, dass Variablen und Funktionen, die sie in einem Benutzerscript definieren nicht in anderen Scripten verfübar sein werden. Um genau zu sein heißt das, dass sie nicht mehr verfügbar sein werden, nachdem das Script einmal ausgeführt wurde. Das bedeutet, dass Sie Probleme bekommen werden, wenn Sie erwartet hatten, die Möglichkeit zu haben, ihre eigenen Funktionen später mit der Benutzung der window.setTimeout
Funktion, oder durch das Setzen von String-Basierten onclick
Atributen auf Links und das Erwarten von Javascript um später ihre Funktionen auszuführen.
Zum Beispiel, wenn das Benutzerscript eine helloworld
-Funktion definiert, und dann versucht einen Timer zu setzen, um sie eine Sekunde später aufzurufen.
Beispiel: Schlechte Art eine Zeitverzögerung einzubauen
function helloworld() { alert('Hello world!'); } window.setTimeout("helloworld()", 60);
Dies wird nicht funktionieren; kein Alarm wird angezeigt werden. Wenn sie die JavaScript-Konsole öffnen, werden Sie eine Ausnahme angezeigt bekommen: Error: helloworld is not defined.
Dies kommt weil zu dem Zeitpunkt, zu dem die Timeout-Funktion abläuft und versucht die helloworld()
Funktion aufzurufen die helloworld
Funktion nicht mehr existiert.
Wenn Sie später auf ihre Benutzerscript-Variablen oder Funktionen zugreifen müssen, müssen Sie diese als Eigenschaften des window
-Objectes definieren, das immer verfügbar ist.
Beispiel: Bessere Art, den Aufruf einer Funktion zu verzögern
window.helloworld = function() { alert('Hello world!'); } window.setTimeout("helloworld()", 60);
Dies arbeitet so wie erwartet: eine Sekunde nachdem die Seite aufgrerufen worden ist, öffnet sich ei Meldungsfenster, der stolz “Hello world!” ausgibt.
Wei auch immer, die Eigenschaft auf window
zu setzen ist immer noch nicht ideal; es ist ein bisschen wie das Benutzen einer globalen Variable, wenn eine lokale Variable aureicht. (Um genau zu sein, es ist genau wie das, weil window
global und für alle Scripte auf der Seite verfügbar ist) Besser wäre es, wenn Sie wenn Sie vermeiden könnten, mit anderen Scripten von der Seite oder anderen Benutzerscripten zusammenzustoßen.
Die beste Lösung ist es eine Anonyme Funktion zu definieren und diese als erstes Argument zur window.setTimeout
-Funktion zu übergeben.
Beispiel: Der beste Weg, eine Funktion aufzurufen
window.setTimeout(function() { alert('Hello world!') }, 60);
Was ich hier tue, ist eine Funktion ohne namen zu erstellen (Eine “Anonyme Funktion”), und dann sofort die Funktion sich selbst zu window.setTimeout
übergeben zu lassen. Dies führ zum gleichen Ergebnis, wie das vorhergehende Beispiel, hinterlässt aber keine Spuren, was dazu führt, dass es für die anderen Scripte nicht sichtbar ist.
Inzwischen benutze ich Anonyme Funktionen regelmäßig, wenn ich Benutzerscripte schreibe. Sie sind Ideal für das Erstellen von “one-off” Funktionen und um sie als Argumente für Dinge wie window.setTimeout
, document.addEventListener
, oder um Event-Handlers wie click
oder submit
mit Funktionen zu vesehen.