<h:head> <h:outputScript name="js/jquery.min.js" /> <h:outputScript name="js/jquery-ui.js" /> </h:head>
但是,在使用PrimeFaces组件时,我会收到类似未捕获的类型错误:
Uncaught TypeError: Cannot read property ‘length’ of undefined
Uncaught TypeError: Object [object Object] has no method ‘autocomplete’
Uncaught TypeError: Cannot read property ‘keyCode’ of undefined
Uncaught TypeError: this.jq.draggable is not a function
Uncaught TypeError: Cannot read property ‘LinearAxisRenderer’ of undefined
Uncaught TypeError: Object [object Object] has no method ‘fileupload’
Uncaught TypeError: this.jqEl.datetimepicker is not a function
等等.
这是怎么造成的,如何解决?
解决方法
摆脱所有那些手动加载的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”是不必要的)
如果你绝对需要提供自己的jQuery版本,因为PrimeFaces中捆绑的那个已经过时了,那么你有两个选择:
>让您的webapp在完全相同的资源标识符(库/名称)/resources/primefaces/jquery/jquery.js上提供自己的(不要更改路径或文件名!).然后将选择这个而不是PrimeFaces捆绑的那个.
>解压缩primefaces.jar,用新版本替换/Meta-INF/resources/primefaces/jquery/jquery.js文件(不要更改路径或文件名!),重新打包一个新的primefaces.jar.
(并且不要忘记删除所有那些< h:outputScript>对自己副本的引用)
然而,测试彻底.一些PrimeFaces特定的功能可能会因升级而中断,因为与PrimeFaces捆绑的版本相比,较新的jQuery版本中的细微更改/错误修正.
最重要的是,您应该确保不提供jQuery / UI的多个副本,否则您仍将面临当前的冲突/冲突.有些人可能会建议使用$.noConflict()绝对不能同时使用多个jQuery库.它的目的是能够将jQuery与另一个JS库一起使用,巧合的是它还使用$()作为全局函数,例如Prototype.另见a.o. Jquery and prototype noconflict.