Konfigurieren von jQuery, so dass es nicht mit anderen Bibliotheken kollidiert

Problem

Wenn jQuery auf einer Seite zusammen mit anderen JavaScript-Bibliotheken geladen wird, kann es passieren, dass beide Bibliotheken eventuell die Variable $ implementieren. Daher wird nur eine dieser Methoden richtig funktionieren.

Lösung

Stellen Sie sich vor, dass Sie eine Webseite übernehmen, die aktualisiert werden muss. Ihr Vorgänger hat eine andere JavaScript-Bibliothek wie Prototype genutzt, aber Sie wollen trotzdem mit jQuery arbeiten. Das führt zu einem Konflikt und eine der beiden Bibliotheken wird nicht funktionieren – abhängig davon, welche Sie im Seiten-Kopf zuerst eingebunden haben.

Deklarieren wir einfach jQuery und Prototype auf der gleichen Seite:

<script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"></script>
<script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

Dies führt zu einem JavaScript-Fehler: element.dispatchEvent is not a function in prototype.js. Glücklicherweise stellt jQuery mit der Methode jQuery.noConflict() einen Workaround bereit:

<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <title>Kapitel 3 - Rezept 7 - Konfigurieren von jQuery, so dass es nicht mit
           einer anderen Bibliothek kollidiert</title>

    <script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"></script>
    <script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
    <!--
        jQuery.noConflict();

        // jQuery über jQuery(...) nutzen
        jQuery(document).ready(function(){
          jQuery("div#jQuery").css("font-weight","bold");
        });

        // Prototype über $(...) usw. nutzen
        document.observe("dom:loaded", function() {
            $('prototype').setStyle({
               fontSize: '10px'
            });
        });
    //-->
   </script>

</head>
<body>
    <div id="jQuery">Hallo, ich bin ein jQuery-div</div>
    <div id="prototype">Hallo, ich bin ein Prototype-div</div>
</body>
</html>

Figure 3-8 zeigt die Ausgabe.

Code-Ausgabe
Figure 3-8. Code-Ausgabe

Wenn Sie jQuery.noConflict() aufrufen, gibt es die Kontrolle über die Variable $ an denjenigen zurück, der sie zuerst implementiert. Haben Sie dies getan, dann können Sie auf jQuery nur über die Variable jQuery zugreifen. Statt $("div p")nutzen Sie jetzt also zum Beispiel jQuery("div p").

Diskussion

Die jQuery-Bibliothek und so gut wie alle Plugins stecken im jQuery-Namenspace. Sie sollten mit den jQuery-Variablen und anderen Bibliotheken (also Prototype, YUI und so weiter) keinerlei Konflikte bekommen. Aber jQuery nutzt auch $ als Abkürzung für das jQuery-Objekt. Diese Definition sorgt für Konflikte mit anderen Bibliotheken, die ebenfalls die Variable $ nutzen. Wie wir in der Lösung gesehen haben, können wir dafür sorgen, dass jQuery die Abkürzung $ freigibt. Stattdessen nutzen wir dann das jQuery-Objekt.

Es gibt noch eine andere Option. Wenn Sie sicherstellen möchten, dass jQuery nicht in Konflikt mit einer anderen Bibliothek gerät, aber trotzdem eine Abkürzung nutzen wollen, können Sie jQuery.noConflict() aufrufen und das Ergebnis einer Variablen zuweisen:

     var j = jQuery.noConflict();

     j(document).ready(function(){
       j("div#jQuery").css("font-weight","bold");
     });

Sie können Ihre eigene Kurzform definieren, indem Sie einen entsprechenden Namen für die Variable nutzen, der Sie jQuery.noConflict() zuweisen.

Schließlich gibt es noch eine dritte Option – das Kapseln Ihres jQuery-Codes in einem Closure:

    jQuery.noConflict();

    (function($){
        $("div#jQuery").css("font-weight","bold");
    })(jQuery);

Mit einem Closure sorgen Sie dafür, dass die Variable $ temporär wieder für das jQuery-Objekt zur Verfügung steht, während es in der Funktion genutzt wird. Endet die Funktion, dann wird die Variable $ wieder an die Bibliothek zurückgegeben, die die ursprüngliche Kontrolle darüber hatte.


Warning

Wenn Sie diese Technik nutzen, werden Sie in der gekapselten Funktion nicht auf die Methoden der anderen Bibliothek zugreifen können, die das $ erwarten.


JQuery Kochbuch
titlepage.xhtml
part0000.html
part0001.html
part0002_split_000.html
part0002_split_001.html
part0002_split_002.html
part0003_split_000.html
part0003_split_001.html
part0003_split_002.html
part0003_split_003.html
part0003_split_004.html
part0003_split_005.html
part0003_split_006.html
part0003_split_007.html
part0004_split_000.html
part0004_split_001.html
part0004_split_002.html
part0004_split_003.html
part0004_split_004.html
part0004_split_005.html
part0004_split_006.html
part0004_split_007.html
part0004_split_008.html
part0004_split_009.html
part0004_split_010.html
part0004_split_011.html
part0004_split_012.html
part0004_split_013.html
part0004_split_014.html
part0004_split_015.html
part0004_split_016.html
part0004_split_017.html
part0004_split_018.html
part0005_split_000.html
part0005_split_001.html
part0005_split_002.html
part0005_split_003.html
part0005_split_004.html
part0005_split_005.html
part0005_split_006.html
part0005_split_007.html
part0005_split_008.html
part0005_split_009.html
part0005_split_010.html
part0005_split_011.html
part0005_split_012.html
part0005_split_013.html
part0006_split_000.html
part0006_split_001.html
part0006_split_002.html
part0006_split_003.html
part0006_split_004.html
part0006_split_005.html
part0006_split_006.html
part0006_split_007.html
part0006_split_008.html
part0006_split_009.html
part0006_split_010.html
part0007_split_000.html
part0007_split_001.html
part0007_split_002.html
part0007_split_003.html
part0007_split_004.html
part0007_split_005.html
part0007_split_006.html
part0007_split_007.html
part0007_split_008.html
part0007_split_009.html
part0007_split_010.html
part0007_split_011.html
part0008_split_000.html
part0008_split_001.html
part0008_split_002.html
part0008_split_003.html
part0008_split_004.html
part0008_split_005.html
part0008_split_006.html
part0008_split_007.html
part0008_split_008.html
part0008_split_009.html
part0008_split_010.html
part0008_split_011.html
part0008_split_012.html
part0008_split_013.html
part0008_split_014.html
part0008_split_015.html
part0008_split_016.html
part0008_split_017.html
part0008_split_018.html
part0008_split_019.html
part0008_split_020.html
part0008_split_021.html
part0008_split_022.html
part0009_split_000.html
part0009_split_001.html
part0009_split_002.html
part0009_split_003.html
part0009_split_004.html
part0009_split_005.html
part0009_split_006.html
part0009_split_007.html
part0009_split_008.html
part0009_split_009.html
part0009_split_010.html
part0010_split_000.html
part0010_split_001.html
part0010_split_002.html
part0010_split_003.html
part0010_split_004.html
part0010_split_005.html
part0010_split_006.html
part0010_split_007.html
part0010_split_008.html
part0010_split_009.html
part0010_split_010.html
part0010_split_011.html
part0011_split_000.html
part0011_split_001.html
part0011_split_002.html
part0011_split_003.html
part0011_split_004.html
part0011_split_005.html
part0011_split_006.html
part0011_split_007.html
part0011_split_008.html
part0011_split_009.html
part0011_split_010.html
part0011_split_011.html
part0012_split_000.html
part0012_split_001.html
part0012_split_002.html
part0012_split_003.html
part0012_split_004.html
part0012_split_005.html
part0012_split_006.html
part0012_split_007.html
part0012_split_008.html
part0013_split_000.html
part0013_split_001.html
part0013_split_002.html
part0013_split_003.html
part0013_split_004.html
part0013_split_005.html
part0013_split_006.html
part0013_split_007.html
part0013_split_008.html
part0013_split_009.html
part0013_split_010.html
part0013_split_011.html
part0013_split_012.html
part0014_split_000.html
part0014_split_001.html
part0014_split_002.html
part0014_split_003.html
part0014_split_004.html
part0014_split_005.html
part0014_split_006.html
part0014_split_007.html
part0014_split_008.html
part0014_split_009.html
part0014_split_010.html
part0014_split_011.html
part0015_split_000.html
part0015_split_001.html
part0015_split_002.html
part0015_split_003.html
part0015_split_004.html
part0015_split_005.html
part0015_split_006.html
part0015_split_007.html
part0015_split_008.html
part0015_split_009.html
part0015_split_010.html
part0016_split_000.html
part0016_split_001.html
part0016_split_002.html
part0016_split_003.html
part0016_split_004.html
part0016_split_005.html
part0016_split_006.html
part0016_split_007.html
part0016_split_008.html
part0016_split_009.html
part0017_split_000.html
part0017_split_001.html
part0017_split_002.html
part0017_split_003.html
part0017_split_004.html
part0017_split_005.html
part0017_split_006.html
part0017_split_007.html
part0017_split_008.html
part0017_split_009.html
part0017_split_010.html
part0017_split_011.html
part0018_split_000.html
part0018_split_001.html
part0018_split_002.html
part0018_split_003.html
part0018_split_004.html
part0018_split_005.html
part0018_split_006.html
part0019_split_000.html
part0019_split_001.html
part0019_split_002.html
part0019_split_003.html
part0019_split_004.html
part0019_split_005.html
part0019_split_006.html
part0019_split_007.html
part0019_split_008.html
part0019_split_009.html
part0019_split_010.html
part0020_split_000.html
part0020_split_001.html
part0020_split_002.html
part0020_split_003.html
part0020_split_004.html
part0020_split_005.html
part0020_split_006.html
part0020_split_007.html
part0020_split_008.html
part0021_split_000.html
part0021_split_001.html
part0021_split_002.html
part0021_split_003.html
part0021_split_004.html
part0021_split_005.html
part0021_split_006.html
part0021_split_007.html
part0021_split_008.html
part0021_split_009.html
part0022.html
part0023.html
part0024.html
part0025.html