jQuery und SharePoint: Der $-Konflikt

Wir haben bestimmt schon alle mal jQuery in SharePoint eingesetzt. So praktisch wie dieses Framework ist. Will man es benutzten, gibt es zwei Möglichkeiten:

  • Entweder mit dem "Alias":​

    $("#id").click(...)
  • Oder mit der längeren Variable:

    jQuery("#id").click(...)

Zuletzt bin ich jedoch auf eine nette Hürde gestoßen: In SharePoint selbst gibt eine JavaScript-Datei, die das $-Zeichen verwendet und mit einer anderen Funktion überschreibt:

SharePoint-jQuery-overview.png

$-Funktion in der CMSSiteManager.js

Diese wird z.B. durch die Miniaturansicht von Bilderbibliotheken, in der Ansicht Inhalte und Struktur verwalten oder im Asset Picker geladen. Daher wird die Variable "$" überschrieben (abhängig welches Skript zuletzt geladen wurde) und man wird ggf. mit vielen hübschen Fehlern beworfen.

Um dies zu verhindern gibt es mehrere Möglichkeiten. Zentral dabei ist die Methode:

jQuery.noConflict();

Diese sorgt dafür, das jQuery nicht mehr das $() belegt und damit für andere Anbieter frei hält. Danach ist die Funktionalität von jQuery nur noch über das Objekt jQuery() erreichbar. Die Methode muss dann möglichst direkt nach dem Laden des jQuery-Skript ausgeführt werden. Ein guter Weg jQuery und noConflict mit CustomActions bereitzustellen wird hier beschrieben:

http://bradcurtis.com/sharepoint-2010-jquery-compatibility-errors-cmssitemanager-js/

Danach gibt es die folgenden Möglichkeiten im Code mit dem fehlenden Alias umzugehen:

  1. jQuery() nutzten:

    jQuery("#ID").click(...)
  2. eine eigene globale Variable erstellen (am besten direkt in einer "noConflict"-Datei):

    $mine = jQuery.noConflict(); $mine("#ID").click(…)
  3. Mein Favorit: "Immidiate Functions" inkl. Übergabeparameter verwenden:

    (function($) { $("#ID").click(...); })(jQuery)

Diese Funktionen haben auch den großen Vorteil (oder ggf. auch Nachteil), dass nicht alle JavaScript-Methoden und Variablen die man deklariert auf globaler Ebene bereit stehen. Nach meinen Erfahrungen benötigt man in 90% der Fälle keine globalen Deklarationen.


Comments