Deus Figendi: "unload" Script

Guten Morgen,
ich habe dieses Forum länger nicht mehr besucht, aber ich hab' Mal wieder ein Anliegen, bei dem ich nicht so recht weiß :D

Also ich arbeite in einem Media Wiki, in diesem Media Wiki ist für die meisten Benutzer (also Autoren) ein JavaScript aktiv, welches die Arbeit erleichtern soll.

Ich habe einen Fork dieses Javascript erstellt und dafür einen Benutzer-Account, der auf das Original keinen Zugriff bekommt (also das Original wird nicht geladen für diesen Account) dafür lade ich den Fork mit dem Benuzter-Javascript (unter /wiki/Benutzer:Benutzername/skinname.js):
importScript('Benutzer:Deus_Figendi/Fork.js');

Nun hat der Fork seit einer Weile einen Status erreicht, in dem man ihn als "unstable" benutzen könnte, darum würde ich ihn gerne anderen Benutzern auch zur Verfügung stellen, so dass sie quasi Beta-Tester werden.

Diese Benutzer können aber nicht so ohne weiteres das Recht am Original-Script aufgeben, weil das an andere Benutzerrechte gekoppelt ist.

Ich befürchte aber, dass wenn beide Scripte aktiv sind sie sich ins Gehege kommen, immerhin sind viele Variablennamen und Funktionsnamen und so weiter identisch (es ist immerhin ein Fork).
Das Script wird aber mehr oder weniger "aktiviert", also es wird eine Schaltfläche zur Verfügung gestellt, die das UI und diversen anderen Kram erst läd wenn man sie betätigt. Zu dem Zeitpunkt sind aber schon die meisten Funktionen geladen und so manche globale Variable...

Darum würde ich sie gerne "entladen", also aus dem Speicher kegeln so dass der Browser sie nicht mehr berücksichtigt.
Das Original wird direkt vor meinem User-Script geladen und zwar mit der gleichen Funktion:
importScript('Benutzer:Originalautor/Original.js');
und zwar vom JavaScript des Skins. (diesmal also dem globalen Skin-JS nicht dem Benutzer-JS)
Da das ja vorher geladen wird habe ich also keinerlei Einfluss darauf DASS es geladen wird, ich muss es irgendwie wieder weg bekommen.

importScript() fügt dann im Übrigen ein <script>-Element in den Kopf der ausgelieferten Ressource ein was dann etwa so aussieht:
<script src="/w/index.php?title=Benutzer:Originalautor/Original.js&amp;action=raw&amp;ctype=text/javascript" type="text/javascript"></script>

Ich könnte nun versuchen dieses Scriptelement zu finden und zu löschen, aber sind damit die Funktionen und globalen Variablen weg?
Oder sind gar all meine Befürchtungen unbegründet und Browser unterscheiden brav welche Funktion aus welchem Script stammt und welche Variable wie angesprochen wird? Sie könnten auch unbegründet sein weil ich alle globalen Variablen und alle Funktionen und Objekte überschreibe nur… bin ich mir vor allem für die Zukunft unsicher ob das immer *alle* sind.

Danke schonmal für Antworten :)

--
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  1. Hallo,

    Ich könnte nun versuchen dieses Scriptelement zu finden und zu löschen, aber sind damit die Funktionen und globalen Variablen weg?

    Natürlich nicht. Das hat nichts miteinander zu tun. Es ist nicht entscheidend, wie ein Script geladen wurde. Wenn es beim Ausführen das Objektsystem ändert, kann das nicht durch das Löschen des zugehörigen script-Elements rückgägngig gemacht werden.

    Oder sind gar all meine Befürchtungen unbegründet und Browser unterscheiden brav welche Funktion aus welchem Script stammt und welche Variable wie angesprochen wird? Sie könnten auch unbegründet sein weil ich alle globalen Variablen und alle Funktionen und Objekte überschreibe nur…

    Wenn du alles sauber überschreibst, dann werden Identifier zu deinen neuen Objekten aufgelöst. Allerdings gibt es noch z.B. Event-Handler, die die alten Funktionen referenzieren. Diese Referenzen gehen nicht über den Namen, d.h. sie ändern sich nicht, wenn du den Namen überschreibst. Da musst du schon den vorherigen Event-Handler entfernen und deinen neuen hinzufügen.

    Das Originalscript kannst du wahrscheinlich nicht ändern, oder? Wenn man dieses sinnvoll kapselt und die Möglichkeit des Entladens einbaut, hättest du die Probleme gar nicht. Eigentlich sollte man alle Scripte heutzutage so aufbauen.

    Mathias

    1. Natürlich nicht. Das hat nichts miteinander zu tun. Es ist nicht entscheidend, wie ein Script geladen wurde. Wenn es beim Ausführen das Objektsystem ändert, kann das nicht durch das Löschen des zugehörigen script-Elements rückgägngig gemacht werden.

      Naja mit Style-Elementen geht das, daher meine Hoffnung XD Aber ich gebe zu es war nur eine schwache Hoffnung (obwohl das mit GreaseMonkey so ist, wenn das Script abgelaufen ist sind alle Objekte alle Variablen alles weg, soweit nicht noch was "offen" ist.)

      Wenn du alles sauber überschreibst, dann werden Identifier zu deinen neuen Objekten aufgelöst.

      Dann ist das wohl der Versuch den ich unternehmen werde :/

      Allerdings gibt es noch z.B. Event-Handler, die die alten Funktionen referenzieren. Diese Referenzen gehen nicht über den Namen, d.h. sie ändern sich nicht, wenn du den Namen überschreibst. Da musst du schon den vorherigen Event-Handler entfernen und deinen neuen hinzufügen.

      Naja, wenn ich mich nicht täusche fügt das Script an Event-Handlern nur eine Schalfläche mit onClick hinzu, die könnte ich ja einfach löschen. Alles andere wird erst danach erstellt oder geladen (hoffe ich)

      Das Originalscript kannst du wahrscheinlich nicht ändern, oder? Wenn man dieses sinnvoll kapselt und die Möglichkeit des Entladens einbaut, hättest du die Probleme gar nicht. Eigentlich sollte man alle Scripte heutzutage so aufbauen.

      Auf das Original hab ich nur bedingten Einfluss. Das Script ist schon alt und der Coder damals noch etwas unerfahren, daher einige Anfängerfehler drin (z.B. globale Laufvariablen). Das ist unter anderem der Grund für den Fork, ich möchte es auf moderne Beine stellen.

      Ob ich dabei soweit gehe wie du vorschlägst weiß ich noch nicht, ich denke eher nicht es erscheint mir recht aufwändig im Nachhinein. Es ist auch alles recht funktionsorientiert, das werde ich wohl auch nicht mehr ändern (dann wäre ich beim kompletten re-write)

      Dennoch danke dann werde ich sie einfach mal parallel testen und gucken ob's klappt und was ich noch überschreiben muss oder ob ich noch EventHandler auflösen muss.

      Danke für deine Antwort :)

      --
      sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(