27 Stimmen

jQuery & Prototype-Konflikt

Ich verwende das jQuery AutoComplete-Plugin in einer HTML-Seite, in der ich auch ein Akkordeon-Menü habe, das Prototyp verwendet.

Sie funktionieren beide separat perfekt, aber als ich versuchte, beide Komponenten in einer einzigen Seite zu implementieren, erhielt ich einen Fehler, den ich nicht verstehen konnte.

nicht gefangene Ausnahme: [Exception... "Die Komponente hat einen Fehlercode zurückgegeben: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMViewCSS.getComputedStyle]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" Ort: "JS frame :: file:///C:/Dokumente und Einstellungen/Administrator/Desktop/website/js/jquery-1.2.6.pack.js :: anonymous :: line 11" data: no]

Ich habe herausgefunden, dass die Datei, die mit jQuery in Konflikt steht, "effects.js" ist, die vom Akkordeon-Menü verwendet wird. Ich habe versucht, diese Datei durch eine neuere Version zu ersetzen, aber neuere scheint das Akkordeon-Verhalten zu brechen.

Meine Vermutung ist, dass die im Akkordeon verwendete Datei "effects.js" geändert wurde, um die Akkordeon-Demoausgabe zu erhalten. Ich habe auch versucht, die überschreibenden Methoden zu verwenden, die jQuery benötigt, um Konflikte mit anderen Bibliotheken zu vermeiden, und das hat nicht funktioniert.

Ich habe die Akkordeon-Demo von stickmanlabs.com .

Und die jQuery AutoVervollständigung kann erhalten werden von jQuery-Website .

Hat noch jemand dieses Problem?

0 Stimmen

119voto

John Resig Punkte 34001

Es gibt zwei mögliche Lösungen: Es gab einen Konflikt mit einer älteren Version von Scriptaculous und jQuery (Scriptaculous hat versucht, den nativen Array-Prototyp falsch zu erweitern) - versuchen Sie zunächst, Ihre Kopie von Scriptaculous zu aktualisieren.

Wenn das nicht funktioniert, müssen Sie noConflict() (wie oben angedeutet). Allerdings gibt es einen Haken. Da Sie ein Plugin einbinden, müssen Sie die Einbindungen in einer bestimmten Reihenfolge vornehmen, zum Beispiel:

<script src="jquery.js"></script>
<script src="jquery.autocomplete.js"></script>
<script>
  jQuery.noConflict();
  jQuery(document).ready(function($){
    $("#example").autocomplete(options);
  });
</script>
<script src="prototype.js"></script>
<script src="effects.js"></script>
<script src="accordion.js"></script>

Ich hoffe, dies trägt zur Klärung der Situation bei.

39 Stimmen

Es gibt nichts Besseres als eine Antwort von John Resig selbst!

10voto

Tahir Akhtar Punkte 11147

JQuery lässt Sie die jQuery-Funktion umbenennen von $ in etwas anderes umzuwandeln, um Namespace-Konflikte mit anderen Bibliotheken zu vermeiden.

Sie können etwa so vorgehen

var J = jQuery.noConflict();

Details hier: michaelshadle.com - Der konfliktfreie Modus von jQuery: ein weiterer Grund, warum es das Beste ist

8voto

Fczbkk Punkte 1417

Ich sehe nicht wirklich den Grund für die gleichzeitige Verwendung beider Bibliotheken in diesem Fall.

Sie können entweder die Prototype-Funktion (oder die Scriptaculous-Funktion) verwenden. Ajax.Autocompleter und jQuery weglassen, oder Sie können jQuery's Akkordeon und Prototype loswerden.

Die gleichzeitige Verwendung beider Bibliotheken ist keine gute Idee, denn:

  1. Sie können Konflikte verursachen.
  2. Wenn Sie beide einbinden, zwingen Sie Ihre Nutzer, beide herunterzuladen. Das ist kein bandbreitenfreundlicher Ansatz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X