L'ajout de jQuery à PrimeFaces donne lieu à une erreur de typographie dans tous les lieux.

J'utilise PrimeFaces 3.5 et JSF 2.0. Je voulais utiliser un plugin jQuery, donc j'ai inclus jQuery dans mon webapp.

<h:head>
    <h:outputScript name="js/jquery.min.js" />
    <h:outputScript name="js/jquery-ui.js" />
</h:head>

Cependant, en utilisant des composants PrimeFaces, j'obtiens des erreurs de type uncaught comme ceci:

Uncaught TypeError: Cannot read property 'length' of undefined

Uncaught TypeError: Object [object object] n'a pas de méthode saisie semi-automatique

Uncaught TypeError: Cannot read property 'keyCode' of undefined

Uncaught TypeError: this.jq.déplaçable n'est pas une fonction

Uncaught TypeError: Cannot read property 'LinearAxisRenderer' of undefined

Uncaught TypeError: Object [object object] n'a pas de méthode 'fileupload'

Uncaught TypeError: this.jqEl.datetimepicker n'est pas une fonction

etc.

comment cela est-il causé et comment puis-je le résoudre?

7
demandé sur BalusC 2013-04-23 13:42:12

1 réponses

PrimeFaces est une bibliothèque de composants JSF basée sur jQuery. Il déjà navires avec jQuery et jQuery UI sur la boîte. Il n'est pas juste de charger manuellement une autre copie de jQuery/jQuery UI pour une raison quelconque. Plusieurs fichiers versioned jQuery différents ne seraient en conflit l'un avec l'autre que de cette façon, parce qu'ils n'utilisent pas nécessairement/partagent exactement les mêmes variables/fonctions.

débarrassez-vous de tous ces fichiers jQuery/UI chargés manuellement. Cela ne fait pas de sens.

si vous avez fait cela parce que vous avez besoin d'utiliser certains jQuery / UI magie dans une page qui n'utilise pas nécessairement n'importe quels composants de PrimeFaces (et donc son jQuery groupé ne sera pas auto-inclus et donc $() ne serait pas disponible), alors vous pouvez toujours manuellement inclure explicitement PrimeFaces-bundled jQuery dans un modèle maître comme ci-dessous:

<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" />

(le target="head" est inutile si vous spécifiez directement à l'intérieur de <h:head> )


si vous avez absolument besoin de fournir votre propre version de jQuery, parce que celle fournie dans PrimeFaces est périmée, alors vous avez 2 options:

  • laissez votre webapp fournir le sien sur exactement le même identificateur de ressource (Bibliothèque/nom) /resources/primefaces/jquery/jquery.js (ne changez pas le chemin ni le nom de fichier!). Celle-ci sera alors cueillie à la place de celle empaquetée.

  • Unpack primefaces.jar , remplacer /META-INF/resources/primefaces/jquery/jquery.js fichier avec la nouvelle version (ne changez ni le chemin ni le nom de fichier!), repack un nouveau primefaces.jar .

(et n'oubliez pas de supprimer tous ces <h:outputScript> références à la propre copie)

Test cependant thorougly. Certaines fonctionnalités de PrimeFaces spécifiques peuvent rompre avec la mise à niveau en raison de modifications / corrections de bugs dans la nouvelle version de jQuery par rapport à la PrimeFaces-bundled one.

par-dessus tout, vous devez absolument vous assurer que vous faites et non fournir plusieurs copies de jQuery/UI, ou vous devrez encore faire face à des conflits/affrontements comme actuellement. Utiliser $.noConflict() comme certaines personnes peuvent suggérer n'est absolument pas destiné à être en mesure d'utiliser plusieurs bibliothèques jQuery ensemble. Il est prévu de pouvoir utiliser jQuery avec une autre bibliothèque JS qui, par coïncidence, utilise aussi $() comme fonction globale, comme Prototype. Voir aussi a. O. Jquery and prototype noconflict .

20
répondu BalusC 2017-05-23 11:45:25