Manchmal hat man die Situation, dass man ein JavaScript einbinden soll, dass die Funktionen document.write oder document.writeln einsetzt. Unschön wird es, wenn damit weitere externe Quellen geladen werden sollen, aber der Pfad ohne Domain ausgegeben wurde. Man hat jetzt die Wahl, dass man entweder den Entwickler des JavaScriptes kontaktiert und um eine Korrektur bittet oder man überschreibt die vorhanden JavaScript-Funktionen mit einer eigenen Funktion und korrigiert den Pfad.

An dieser Stelle möchte ich auf das Verändern der JavaScript-Funktion eingehen. In JavaScript besteht die Möglichkeit, dass man die Standard-Funktionen des Browsers mit eigenen Funktionen überschreiben kann. Dadurch hat man die Möglichkeit ein gänzlich anderes Verhalten zu generieren. Eine Funktion zu überschreiben ist recht einfach und sieht wie folgt aus:

document.write = function() {};

Und schon ist die Funktion document.write überschrieben. Da wir an dieser Stelle keine weiteren Anweisungen gemacht haben, laufen jetzt alle document.write Aufrufe ins Leere (was durchaus auch gewünscht sein kann).

Wenn man die ursprüngliche Funktionalität beibehalten möchte, muss man den obigen Code um folgende Zeile erweitern:

return function(s) {
    w.call(this, s);
}

Daraus ergibt sich dann folgende komplette Funktion:

document.write = function(w) {
    return function(s) {
        w.call(this, s);
    }
}(document.write);

Jetzt kann man auch anstelle von w.call(this, s) folgenden Code schreiben: w.call(this, myOwnFunction(s)). Dadurch ist es möglich, den String, der an document.write übergeben wurde, zu parsen. Schöner wäre es natürlich, wenn man vorher noch guckt, ob myOwnFunction überhaupt gibt. Dadurch kann man den Code auch auf andere Domains kopieren, wo die Funktion myOwnFunction nicht existiert und es kommt zu keinen Problemen.

document.write = function(w) {
    if(typeof  myOwnFunction == 'function') {
        return function(s) {
            w.call(this, myOwnFunction(s));
       }
   }
   return function(s) {
       w.call(this, s);
   }
}(document.write);