Dive Into Greasemonkey

Greasemonkey Lernen (Deutsche Version)

2.3. Ein Benutzerscript schreiben

Unser erstes Script gibt einfach nur eine Meldung mit dem Inhalt “Hello World!” aus, wenn es ausgeführt wird.

Beispiel: Die “Hello world!” Meldung ausgeben

alert('Hello World!');

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.

← Ein Benutzerscript mit Meta-Daten beschreiben
Ihr Benutzerscript editieren →