[Vorige Seite...]
Herr Ober, das Menü bitte!
Greasemonkey bietet sogar ein spezielles Menü in dem vom Skript definierte Menüpunkte auftauchen können. Man erreicht dieses Menü durch ein Rechtsklick auf den Affenschädel unter "Benutzerskript-Befehle".
Um hierin einen eigenen Menüpunkt unterzubringen muß man eine benannte oder anonyme Funktion der API-Funktion GM_registerMenuCommand übergeben, wie folgendes Beispiel zeigt:
function toggle() {
if(GM_getValue('switch')) {
GM_deleteValue('switch');
} else {
GM_setValue('switch', 1);
}
}
GM_registerMenuCommand("Diskomodus an-/ausschalten", toggle);
Die netten Details zu GM_registerMenuCommand finden sich auf der entsprechenden Wiki-Seite, die man sich ebenso zu Gemüte führen sollte.
Probleme mit dem Menü
Es gibt allerdings drei gravierende Probleme mit dieser Funktion:
- Die Tastatur-Shortcut-Optionen funktionieren nicht. Zumindest nicht bei mir.
- Der Menü-Eintrag kann zur Laufzeit nicht wieder entfernt werden. Man muß hierfür eine neue Seite laden.
- Durch einen uralten, noch nicht behobenen Bug in Greasemonkey, überlebt der Menü-Eintrag in der Regel den Wechsel einer Seite. Die referenzierte Funktion, die aufgerufen wird, bezieht sich dann auf eine alte Instanz im Speicher, die wiederum die vorige Website referenziert. Veränderungen an der vorigen Website durch appendChild und sowas resultieren dann in cross site scripting exceptions und das ist wirklich voll doof!
Am besten benutzt man das Menü ausschließlich um Konfigurationswerte an- oder auszustellen.
Huch, warum geht das nicht?!
Jaja... die liebe, liebe Sicherheit. Ein paar Dinge sollten in so einer Skripting-Umgebung schon abgeschirmt werden, daher verhalten sich ein paar bekannte Objekte nicht so ganz wie gewohnt. Dazu gehören das window-Objekt... ach und all die anderen Dokument-Knoten, mit denen man als JavaScript-Programmierer sonst herumhantiert.
Die ganzen Objekte sind eingebettet in einem Sicherheits-Objekt, welches den wunderbar klangvollen Namen XPCNativeWrapper trägt.
Aber kein Grund zur Beunruhigung! Man muß einfach ein bissl sauberer arbeiten und vernünftig von den zur Verfügung stehendem Methoden gebrauch machen.
Warum geht mein Event nicht?
// Warum geht das nicht?? 
document.body.onload = function() {
alert('Hallihallo!');
};
Events sollte man über die Methode Element.addEventListener hinzufügen. Dann gibt's auch keine böse Überraschung mehr. Auf direktem Wege einen Event-Handler zu überschreiben würde im Schlimmstfall die Funktionalität der veränderten Homepage beeinträchtigen, weil dort ein entsprechender Event-Handler eventuell ausgehebelt wird.
Da Element.addEventListener die Registrierung mehrerer Event-Handler erlaubt, die nacheinander über das gewünschte Ereignis informiert werden, ist es generell eine gute Praxis, von dieser Methode gebrauch zu machen. Entfernen lassen sich zuvor registrierte Event-Handler über die Methode Element.removeEventListener.
Warum geht mein Timeout nicht?
Dafür gibt es zwei mögliche Ursachen.
window.setTimeout("meineFunktion()", 1000);
Man sollte es vermeiden, als erstes Argument einen String anzugeben. Das geht einfach nicht. Stattdessen sollte man direkt den Funktionsnamen angeben, wodurch man dann setTimeout eine Referenz auf die jeweilige Funktion übergibt:
window.setTimeout(meineFunktion, 1000);
- Wenn es das nicht ist, dann kann es nur an NoScript liegen. Diese Firefox-Erweiterung unterdrückt window.setTimeout auf Websites, die keine JavaScript-Ausführungsberechtigung haben. Da kann man leider nix machen, außer den NoScript-Programmieren mal aufs Dach zu steigen, daß sie das für Greasemonkey-Entwickler ändern.
Übrigens: NoScript hindert ansonsten trotzdem nicht die Ausführung von Greasemonkey-Skripten!
AJAX auf Steroid!
Die derzeitige Sicherheitspolitik von Webbrowsern untersagt es dem JavaScript-Entwickler sogenannte Cross-Site-Zugriffe über das allseits beliebte XMLHttpRequest-Objekt durchzuführen. Das ist einigen Fällen sehr blöd, wenn man zum Beispiel einfach nur RSS-Newsfeeds einer anderen Website via JavaScript auslesen mag. Geht erst mal nicht. Da muß man sich nen Server-Proxy auf der eigenen Domain dazu basteln, welches die fremden Inhalte durchschleift.
Aber hier kommt das erfreuliche Novum - Greasemonkey bietet ein eigenes XMLHttpRequest an, welches Daten von x-beliebigen Domains runterschaufeln läßt. Das ist sowas von irre praktisch, da könnte man weinen vor Glück.
Man stelle sich einfach mal vor, den Wetterbericht von der API einer Website X abzufragen und dann in der gerade betrachteten Website Y via Greasemonkey einzubauen. Ist doch schön, wenn die Dinge mal so klappen, wie man sich das auch denkt.
GM_xmlhttpRequest heißt das gute Stück, welches man sich auf der Entwickler-Wiki unbedingt mal genauer anschauen sollte. Man kann damit ordinäre HTML-Seiten, Dateien und XML-Dokumente aus dem Netz laden. Bei letzterem Fall wird sogar angeboten, den Spaß zu parsen, um einen netten XML-Baum für XPath-Anfragen zu gewinnen.
Ein einfaches Anwendungsbeispiel:
GM_xmlhttpRequest({
method: "GET",
url: "http://www.google.com/",
onload: function(response) {
alert(response.responseText);
}
});
[...Nächste Seite]