将jQuery添加到PrimeFaces导致所有地方都出现Uncaught TypeError

gal*_*lao 11 jquery jsf typeerror primefaces

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

但是,在使用PrimeFaces组件时,我会收到类似未捕获的类型错误:

未捕获的TypeError:无法读取未定义的属性"长度"

未捕获的TypeError:对象[object Object]没有方法'autocomplete'

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

未捕获的TypeError:this.jq.draggable不是函数

未捕获的TypeError:无法读取未定义的属性"LinearAxisRenderer"

未捕获的TypeError:对象[object Object]没有方法'fileupload'

未捕获的TypeError:this.jqEl.datetimepicker不是函数

等等.

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

Bal*_*usC 25

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

摆脱所有那些手动加载的jQuery/UI文件.这毫无意义.

如果你这样做是因为你需要在一些不一定使用任何PrimeFaces组件的页面中使用一些jQuery/UI魔法(因此它的捆绑jQuery不会被自动包含,因此$()不可用),那么你可以随时在一些主模板中手动显式包含PrimeFaces-bundled jQuery,如下所示:

<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" />
Run Code Online (Sandbox Code Playgroud)

(target="head"如果你直接在里面指定它们是没有必要的<h: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库一起使用,这个JS库同时也$()用作全局函数,例如Prototype.另见ao Jquery和原型noconflict.

  • 同样,你**不应该**提供另一个jQuery副本.相反,升级/覆盖PrimeFaces提供的. (4认同)