向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:
-
让你的web应用程序自己提供完全相同的资源标识符(库/名称)
/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 。