Das Hinzufügen von jQuery zu PrimeFaces führt zu Uncaught TypeError überall

Ich benutze PrimeFaces 3.5 und JSF 2.0. Ich wollte ein jQuery-Plugin verwenden, also habe ich jQuery in meine Webapp eingebunden.

    

Bei der Verwendung von PrimeFaces-Komponenten erhalte ich jedoch nicht abgefangene Fehlertypen:

Uncaught TypeError: Kann die Eigenschaft ‘length’ von undefined nicht lesen

Uncaught TypeError: Objekt [Objekt Objekt] hat keine Methode ‘Autocomplete’

Uncaught TypeError: Kann die Eigenschaft ‘keyCode’ von undefined nicht lesen

Uncaught TypeError: this.jq.draggable ist keine function

Uncaught TypeError: Die Eigenschaft ‘LinearAxisRenderer’ von undefined kann nicht gelesen werden

Uncaught TypeError: Objekt [Objekt Objekt] hat keine Methode ‘Dateiupload’

Uncaught TypeError: this.jqEl.datetimepicker ist keine function

Etc.

Wie wird das verursacht und wie kann ich es lösen?

Solutions Collecting From Web of "Das Hinzufügen von jQuery zu PrimeFaces führt zu Uncaught TypeError überall"

PrimeFaces ist eine jQuery-basierte JSF-Komponentenbibliothek. Es wird bereits mit jQuery und jQuery UI ausgeliefert. Es ist nicht richtig, aus irgendeinem Grund manuell eine andere Kopie von jQuery / jQuery UI zu laden. Mehrere unterschiedliche versionierte jQuery-Dateien würden auf diese Weise nur miteinander in Konflikt geraten, da sie nicht notwendigerweise dieselben Variablen / functionen verwenden / teilen.

Befreien Sie sich von allen manuell geladenen jQuery / UI-Dateien. Das macht keinen Sinn.

Wenn Sie dies getan haben, weil Sie einige jQuery / UI-Magie in einer Seite verwenden müssen, die nicht unbedingt PrimeFaces-Komponenten verwendet (und somit sein gebündeltes jQuery nicht automatisch enthalten ist und somit $() nicht verfügbar wäre), dann Sie können PrimeFaces-gebündelte jQuery immer manuell in einige Master-Vorlagen einfügen:

   

(Das target="head" ist nicht notwendig, wenn Sie sie direkt in angeben)


Wenn Sie unbedingt Ihre eigene Version von jQuery bereitstellen müssen, da die in PrimeFaces gebündelte Version veraltet ist, haben Sie 2 Möglichkeiten:

  • Lassen Sie Ihre Webanwendung ihre eigene Ressource mit genau demselben Ressourcenbezeichner (library / name) /resources/primefaces/jquery/jquery.js (ändern Sie weder den Pfad noch den Dateinamen!). Dieser wird dann anstelle des PrimeFaces-gebündelten Picks abgeholt.

  • Entpacken Sie primefaces.jar , ersetzen /META-INF/resources/primefaces/jquery/jquery.js Datei /META-INF/resources/primefaces/jquery/jquery.js durch die neuere Version (ändern Sie weder den Pfad noch den Dateinamen!), Packen Sie eine neue primefaces.jar .

(und vergiss nicht, alle Referenzen auf die eigene Kopie zu entfernen)

Testen Sie jedoch gründlich. Einige PrimeFaces-spezifische functionen können mit dem Upgrade aufgrund von kleineren Änderungen / Bugfixes in der neueren jQuery-Version im Vergleich zu PrimeFaces-gebündelten Versionen brechen.

Vor allem sollten Sie absolut sicher gehen, dass Sie nicht mehrere Kopien von jQuery / UI bereitstellen, oder Sie werden immer noch mit Konflikten / Zusammenstößen konfrontiert, wie es derzeit der Fall ist. Die Verwendung von $.noConflict() wie einige Leute vorschlagen, ist absolut nicht dazu gedacht, mehrere jQuery-Bibliotheken zusammen verwenden zu können. Es ist beabsichtigt, jQuery zusammen mit einer anderen JS-Bibliothek zu verwenden, die zufälligerweise auch $() als globale function verwendet, wie beispielsweise Prototype. Siehe auch ua Jquery und Prototyp noconflict .