12

我正在使用 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 组件时,我会收到如下未捕获的类型错误:

未捕获的类型错误:无法读取未定义的属性“长度”

未捕获的类型错误:对象 [对象对象] 没有方法“自动完成”

未捕获的类型错误:无法读取未定义的属性“keyCode”

未捕获的类型错误:this.jq.draggable 不是函数

未捕获的类型错误:无法读取未定义的属性“LinearAxisRenderer”

未捕获的类型错误:对象 [对象对象] 没有方法“文件上传”

未捕获的类型错误:this.jqEl.datetimepicker 不是函数

等等。

这是如何引起的,我该如何解决?

4

1 回答 1

28

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

摆脱所有那些手动加载的 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" />

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 捆绑的版本相比,较新的 jQuery 版本中的微小更改/错误修复,某些 PrimeFaces 特定功能可能会因升级而中断。

最重要的是,您应该绝对确保您提供 jQuery/UI 的多个副本,否则您仍将面临当前的冲突/冲突。像某些人可能建议的那样使用$.noConflict()绝对不是为了能够一起使用多个 jQuery 库。它的目的是能够将 jQuery 与另一个 JS 库一起使用,该库巧合地也$()用作全局函数,例如 Prototype。另请参阅 ao Jquery 和原型 noconflict

于 2013-04-23T12:08:12.147 回答