我正在使用 PrimeFaces 3.5 和 JSF 2.0。我想使用 jQuery 插件,因此我将 jQuery 包含在我的 web 应用程序中。
<h:head>
<h:outputScript name="js/jquery.min.js" />
<h:outputScript name="js/jquery-ui.js" />
</h:head>
但是,当使用 PrimeFaces 组件时,我会遇到如下未捕获的类型错误:
未捕获的类型错误:无法读取未定义的属性“长度”
未捕获的类型错误:对象 [object Object] 没有方法“自动完成”
未捕获的类型错误:无法读取未定义的属性“keyCode”
未捕获的类型错误:this.jq.draggable 不是函数
未捕获的类型错误:无法读取未定义的属性“LinearAxisRenderer”
未捕获的类型错误:对象 [object Object] 没有方法“fileupload”
未捕获的类型错误:this.jqEl.datetimepicker 不是函数
Etc.
这是如何引起的以及如何解决?
PrimeFaces 是一个基于 jQuery 的 JSF 组件库。它already附带 jQuery 和 jQuery UI,开箱即用。由于某种原因,手动加载 jQuery/jQuery UI 的另一个副本是不正确的。多个不同版本的 jQuery 文件只会以这种方式相互冲突,因为它们不一定使用/共享完全相同的变量/函数。
摆脱所有手动加载的 jQuery/UI 文件。这毫无意义。
如果您这样做是因为您需要在某些页面中使用一些 jQuery/UI 魔法,而该页面不一定使用任何 PrimeFaces 组件(因此其捆绑的 jQuery 不会被自动包含,因此$()
将不可用),那么您始终可以在某些主模板中手动显式包含 PrimeFaces 捆绑的 jQuery,如下所示:
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" />
(the target="head"
如果你直接在里面指定它们是不必要的<h:head>
)
如果您绝对需要提供自己的 jQuery 版本,因为 PrimeFaces 中捆绑的版本已经过时,那么您有 2 个选择:
让您的 web 应用程序在完全相同的资源标识符(库/名称)上提供自己的资源/resources/primefaces/jquery/jquery.js
(不要更改路径或文件名!)。然后将选择这个而不是 PrimeFaces 捆绑的那个。
Unpack primefaces.jar
, 代替/META-INF/resources/primefaces/jquery/jquery.js
使用较新版本的文件(不要更改路径或文件名!),重新打包新版本primefaces.jar
.
(并且不要忘记删除所有这些<h:outputScript>
引用自己的副本)
但要彻底测试。由于与 PrimeFaces 捆绑版本相比,较新的 jQuery 版本中存在微小的更改/错误修复,因此某些 PrimeFaces 特定的功能可能会因升级而中断。
最重要的是,您应该绝对确保您这样做not提供 jQuery/UI 的多个副本,否则您仍然会像现在一样面临冲突/冲突。使用$.noConflict()
正如有些人可能建议的那样,绝对不是为了能够一起使用多个 jQuery 库。它的目的是能够将 jQuery 与另一个 JS 库一起使用,该库恰好也使用$()
作为全局函数,例如 Prototype。另请参见 a.o.Jquery和原型不冲突.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)