Die Kurzform $ in Ihrem Plugin verwenden

Problem

Andere JavaScript-Bibliotheken nutzen $. jQuery selbst nutzt $ nur als Kurzform, während das Haupt-Objekt den Namen jQuery trägt. Wie können Sie sicherstellen, dass Ihr Plugin mit anderen Plugins und Bibliotheken kompatibel bleibt?

Lösung

jQuery nutzt die Funktion $ als eigenen Alias für das jQuery-Objekt. Wird jQuery in den Kompatibilitätsmodus versetzt, dann übergibt es die Kontrolle über den Alias $ zurück an die Bibliothek, die ihn definiert hat. Plugins können so programmiert werden, dass sie die gleiche Technik verwenden.

Indem Sie Ihr Plugin in einer anonymen Funktion verpacken und diese Funktion direkt ausführen, wird die Kurzform $ innerhalb des Plugins gehalten. Code außerhalb des Plugins kann $ ganz normal verwenden. Innerhalb des Plugins bezieht sich $ wie üblich auf das jQuery-Objekt:

;(function($) {
  $.fn.pulse = function(options) {
    // Übergebene Optionen mit den Standardwerten verbinden
    var opts = $.extend({}, $.fn.pulse.defaults, options);

    return this.each(function() {
      // Pulse!
      for(var i = 0;i<opts.pulses;i++) {
        $(this).fadeTo(opts.speed,opts.fadeLow).fadeTo(opts.speed,opts.fadeHigh);
      }

      // Zurücksetzen auf Anfang
      $(this).fadeTo(opts.speed,1);
    });
  };

  // Standard-Optionen für das Pulse-Plugin
  $.fn.pulse.defaults = {
    speed: "slow",
    pulses: 2,
    fadeLow: 0.2,
    fadeHigh: 1
  };
})(jQuery);

Diskussion

Indem Sie Ihren Code in einer anonymen Funktion verpacken, erhalten Sie eine Reihe netter Features und Ihr Plugin-Code ist in der großen, weiten Welt, in der Ihre Anwender leben, deutlich robuster. Zudem ist dieser Schritt einfach und unkompliziert.

Durch ein Semikolon am Anfang Ihrer Funktionsdefinition schützen Sie Ihren Code vor unbeabsichtigten Änderungen durch andere Entwicklern, die eventuell ein Semikolon am Ende ihrer eigenen Bibliothek vergessen haben. JavaScript beendet zwar standardmäßig Anweisungen auch an einem Zeilenumbruch, aber viele Anwender nutzen Minimierungs-Tools, die den gesamten JavaScript-Code in ihrem Projekt in einer einzigen Datei zusammenfassen. Dieser Prozess entfernt auch die Zeilenumbrüche und kann zu Fehlern führen, wenn Ihr Code direkt danach folgt. Das Semikolon am Anfang Ihres Codes ist eine schneller und einfacher Trick, der Sie davor bewahrt.

Die öffnende Klammer ist direkt der Anfang der Definition der anonymen Funktion. Innerhalb unserer anonymen Funktion definieren wir eine Funktion, die die Variable übergibt, welche wir anstatt des vollständig benannten jQuery-Objekts nutzen wollen. In diesem Fall wollen wir $ als Variable nutzen. Aufgrund des Scope-Handlings von JavaScript müssen wir eine zusätzliche Funktion definieren. In klassischeren Sprachen wie Java und C++ ist der Gültigkeitsbereich auf den Block beschränkt. In JavaScript bezieht sich der Gültigkeitsbereich hingegen auf die Funktion. Daher erzeugen wir hier eine Funktion, um eine Grenze für den Gültigkeitsbereich in unserem Plugin zu haben.

Dann folgt eine neue Version unseres Plugins, in der nur der Zugriff auf das jQuery-Objekt geändert wurde. Da wir dieses Plugin anonym gekapselt und den Scope der Variablen $ begrenzt haben, können wir $ jetzt ohne Konflikte mit anderem Code verwenden.

Die letzte Zeile schließt die Scope-Funktion und die anonyme Funktion mit einer geschweiften und einer runden Klammer. Anschließend rufen wir unsere anonyme Funktion direkt auf. Dabei übergeben wir das jQuery-Objekt, das dann innerhalb der Funktion als $ angesprochen wird. Schließlich beenden wir unsere neue Anweisung mit einem Semikolon, um Minimierungs- und Komprimierungsprobleme zu vermeiden.

Die Kurzform $ kann beim Schreiben von JavaScript-Code ausgesprochen nützlich sein. Die Größe des Codes wird reduziert, das Design verbessert und zudem erfreut sich diese Verwendung wachsender Beliebtheit. Daher nutzen viele Bibliotheken diese Kurzform in ihrem eigenen Kontext. Aber mit jeder zusätzlichen Bibliothek, die das Zeichen $ auf diese Art und Weise verwendet, können auch mehr Konflikte entstehen. Durch das Kapseln Ihres Codes in einer anonymen Funktion stellen Sie sicher, dass Ihr Plugin den Gültigkeitsbereich für $ im Griff hat und damit potenzielle Konflikte mit anderen JavaScript-Bibliotheken vermieden werden.

Ein zusätzlicher Nebeneffekt dieser Kapselung ist der, dass ein Closure erzeugt wird. Auf diesem Weg werden die Namensräume von Methoden oder Variablen, die Sie definieren müssen, ordentlich getrennt. Damit verringert sich die Wahrscheinlichkeit, dass es Namenskonflikte mit anderem Code gibt.

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