Die in SharePoint 2010 neue Möglichkeit, JavaScript Dateien bei Bedarf zu laden, ermöglicht eine bessere Kontrolle der zu einzelnen Dateien und deren Abhängigkeiten untereinander. In Zeiten in denen immer mehr von JavaScript, und damit vom Browser, abgearbeitet wird ist eine solche Funktionalität essentiell. Das "Script on Demand" (SOD) besteht im Grunde das 5 Funktionen:
NotifyScriptLoadedAndExecuteWaitingJobs: Ein Trigger, der SOD mitteilt das ein bestimmtes JavaScript geladen wurde.
ExecuteOrDelayUntilScriptLoaded: Ein Callback der getriggter wird wenn das angegebene Script geladen wurde.
RegisterSod: Zum Registrieren der JavaScript Datei anhand von Schlüssen und Pfad zur Datei.
RegisterSodDep: Zum Definieren von Abhängigkeiten zu anderen Skripten.
EnsureScriptFunc: Der Auslöser, der die gewünschte JavaScript Datei inkl. ihrer Abhängigkeiten lädt.
Hier anhand eine kurzen Beispiels zum Laden von jQuery und der jQuery UI:
Letzte Zeile im Script für jQuery UI:
...
if (typeof (NotifyScriptLoadedAndExecuteWaitingJobs) == "function") {
NotifyScriptLoadedAndExecuteWaitingJobs("jquery-ui.1.8.16.js");
};
SOD Register Block im HTML
ExecuteOrDelayUntilScriptLoaded(function(){
alert('jQuery UI is ready!');
},'jquery-ui.1.8.16.js');
RegisterSod('jquery-ui.1.8.16.js','/ScriptResource.axd?d=RU7uNr...');
RegisterSod('jquery.1.6.4.js','/ScriptResource.axd?d=N64HMcQl...');
RegisterSodDep('jquery-ui.1.8.16.js','jquery.1.6.4.js');
EnsureScriptFunc('jquery-ui.1.8.16.js');
Wie alles im Leben hat auch SOD seine Eigenheiten und Macken. Diese möchte ich nun kurz beschreiben und die möglichen Workarounds beschreiben:
RegisterSodDep({Schlüssel des Kind JavaScript},{Schlüssel des Eltern JavaScript}
Bei der Registrierung eines Skripts via RegisterSod wird der Schlüssel intern als lowercase Zeichenfolge gespeichert. Bei der Definition der Anhängigkeit vom Kind zum Elter wird aber der Schlüssel vom Elter nicht lowercase gespeichert. Wenn nun uppercase Zeichen im Schlüssel vorhanden sind, kann SOD das Elternelement nicht finden und überspringt diese Abhängigkeit.
Workaround:
Bei Schlüsseln in SOD am besten immer alles lowercase angeben oder bei RegisterSodDep mindestens den 2. Parameter lowercase angeben.
Laden von JavaScript Dateien aus geschützten Ordnern
Wenn eine JavaScript Datei z.B. in der Style Library liegt und das Portal eine Authentifizierung benötigt, kann es sein das SOD an seine Grenzen stößt und nicht mitbekommt das bestimmte Dateien geladen wurden. SOD ist eventbasierend und feuert ein OnLoad Event bei erfolgreichem Laden einer JavaScript Datei. Bei z.B. NTLM ist es nun leider so das die ersten Anfragen mit einer 401 quittiert werden. Diesen Ablauf kann man sehr schön im Firebug beobachten. Durch die geworfenen Fehler, ist das Skript für SOD nun nicht geladen worden und befindet sich im "Pending" Status.
Workaround:
Damit SOD auch Dateien aus geschützten Ordnern lesen kann, muss etwas in die Trickkiste gegriffen werden. In der JavaScript Datei muss in der internen Variable von SOD
_v_dictSod der Status per Hand gesetzt werden.
Sollte sich nun das jQuery Script in einem solchen Ordner befinden muss die letzte Zeile wie folgt lautet:
_v_dictSod['jquery.1.6.4.js'].state = 4;
Das ist zwar etwas durch die Brust-in-Auge aber es funktioniert.