向PrimeFaces添加jQuery会导致Uncaught TypeError覆盖整个地方

我正在使用PrimeFaces 3.5和JSF 2.0。 我想使用jQuery插件,所以我在我的webapp中包含了jQuery。

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

但是,当使用PrimeFaces组件时,我会得到未捕获的types错误,如下所示:

Uncaught TypeError:无法读取未定义的属性“长度”

Uncaught TypeError:Object [object Object]没有方法'autocomplete'

Uncaught TypeError:无法读取未定义的属性'keyCode'

Uncaught TypeError:this.jq.draggable不是一个函数

Uncaught TypeError:无法读取未定义的属性“LinearAxisRenderer”

Uncaught TypeError:Object [object Object]没有方法'fileupload'

Uncaught TypeError:this.jqEl.datetimepicker不是一个函数

等等。

这是如何造成的,我该如何解决?

PrimeFaces是一个基于jQuery的JSF组件库。 它已经包含jQuery和jQuery UI。 由于某种原因手动加载jQuery / jQuery UI的另一个副本是不正确的。 多个不同版本的jQuery文件只会以这种方式相互冲突,因为它们不一定使用/共享完全相同的variables/函数。

摆脱所有那些手动加载的jQuery / UI文件。 这没有任何意义。

如果你这样做是因为你需要在一些不需要使用PrimeFaces组件的页面中使用一些jQuery / UI魔术(因此它的捆绑jQuery不会被自动包含,因此$()将不可用),那么您总是可以手动明确地在一些主模板中包含PrimeFaces捆绑的jQuery,如下所示:

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

(如果直接在<h:head>指定target="head"则不需要target="head"


如果你绝对需要提供你自己的jQuery版本,因为在PrimeFaces中捆绑的版本已经过时了,那么你有两个select:

  • 让你的w​​eb应用程序自己提供完全相同的资源标识符(库/名称) /resources/primefaces/jquery/jquery.js (不要更改path或文件名!)。 然后select这个,而不是PrimeFaces捆绑的。

  • 解压primefaces.jar ,用新版本replace/META-INF/resources/primefaces/jquery/jquery.js文件(不要更改path或文件名!),重新包装一个新的primefaces.jar

(并且不要忘记删除所有这些<h:outputScript>引用来拥有自己的副本)

然而,testing却非常糟糕。 一些PrimeFaces特定的function可能会因升级而中断,因为与PrimeFaces捆绑的相比,较新版本的jQuery版本中的微小更改/错误修正。

最重要的是,您应该确保提供多个jQuery / UI副本,否则您仍然会面临冲突/冲突。 使用$.noConflict()因为一些人可能会build议绝对不能一起使用多个jQuery库。 它的意图是能够将jQuery与另一个JS库一起使用,它同时也使用$()作为全局函数,比如Prototype。 另请参阅jQuery和原型noconflict 。