Agregar/cargar jQuery manualmente con PrimeFaces genera errores de tipo no detectados

Resuelto galao asked hace 11 años • 1 respuestas

Estoy usando PrimeFaces 3.5 y JSF 2.0. Quería usar un complemento jQuery, así que incluí jQuery en mi aplicación web.

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

Sin embargo, cuando uso componentes PrimeFaces, obtengo errores de tipo no detectados como este:

TypeError no detectado: no se puede leer la propiedad 'longitud' de indefinido

TypeError no detectado: el objeto [objeto Objeto] no tiene ningún método de 'autocompletar'

TypeError no detectado: no se puede leer la propiedad 'keyCode' de indefinido

TypeError no detectado: this.jq.draggable no es una función

TypeError no detectado: no se puede leer la propiedad 'LinearAxisRenderer' de indefinido

TypeError no detectado: el objeto [objeto Objeto] no tiene el método 'carga de archivos'

TypeError no detectado: this.jqEl.datetimepicker no es una función

Etc.

¿Cómo se produce esto y cómo puedo solucionarlo?

galao avatar Apr 23 '13 16:04 galao
Aceptado

PrimeFaces es una biblioteca de componentes JSF basada en jQuery. Ya viene con jQuery y jQuery UI listos para usar. No es correcto cargar manualmente otra copia de jQuery/jQuery UI por algún motivo. Múltiples archivos jQuery con versiones diferentes solo entrarían en conflicto entre sí de esta manera, porque no necesariamente usan/comparten exactamente las mismas variables/funciones.

Deshágase de todos esos archivos jQuery/UI cargados manualmente. Esto no tiene sentido.

Si hizo esto porque necesita utilizar algo de jQuery/UI magic en alguna página que no necesariamente usa ningún componente PrimeFaces (y por lo tanto su jQuery incluido no se incluirá automáticamente y, por lo tanto, $()no estará disponible), entonces siempre puede Incluya manualmente y explícitamente jQuery incluido en PrimeFaces en alguna plantilla maestra como se muestra a continuación:

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

(Esto target="head"es innecesario si los especifica directamente dentro <h:head>)


Si es absolutamente necesario proporcionar su propia versión de jQuery, porque la que viene incluida en PrimeFaces está desactualizada, entonces tiene 2 opciones:

  • Deje que su aplicación web proporcione exactamente el mismo identificador de recurso (biblioteca/nombre) /resources/primefaces/jquery/jquery.js(¡no cambie la ruta ni el nombre del archivo!). Luego se elegirá este en lugar del incluido en PrimeFaces.

  • Desempaquete primefaces.jar, reemplace /META-INF/resources/primefaces/jquery/jquery.jsel archivo con la versión más nueva (¡no cambie la ruta ni el nombre del archivo!), vuelva a empaquetar un nuevo archivo primefaces.jar.

(y no olvides eliminar todas esas <h:outputScript>referencias a tu propia copia)

Pruébelo a fondo. Algunas funciones específicas de PrimeFaces pueden interrumpirse con la actualización debido a cambios menores/correcciones de errores en la versión más nueva de jQuery en comparación con la versión incluida en PrimeFaces.

Sobre todo, debe asegurarse absolutamente de no proporcionar varias copias de jQuery/UI, o seguirá enfrentando conflictos/choques como ocurre actualmente. El uso $.noConflict(), como algunas personas pueden sugerir, no tiene la intención de poder usar varias bibliotecas jQuery juntas. Su intención es poder usar jQuery junto con otra biblioteca JS que casualmente también usa $()como función global, como Prototype. Véase también Jquery y prototipo noconflict .

BalusC avatar Apr 23 '2013 12:04 BalusC