JQuery 与 Primefaces 冲突? [复制]

Posted

技术标签:

【中文标题】JQuery 与 Primefaces 冲突? [复制]【英文标题】:JQuery Conflicts with Primefaces? [duplicate] 【发布时间】:2011-07-24 08:36:37 【问题描述】:

我在 JSF 页面的标题中包含了 JQuery1.5。在那个页面中有一堆已经编码的 Primefaces 组件。在我将Jquery.js 包含在页面标题中后,一些primefaces 组件(如<p:commandButton>)失去了它们的皮肤,<p:fileUpload> 看起来像普通的JSP <input type="file"> 并完全失去了它的AJAX 功能。

有没有办法安全地使用 JQuery 和 primefaces(没有冲突)?

【问题讨论】:

我不明白为什么这个问题被标记为This question has been ask before。链接的问题是在此问题后 2 年提出的。 【参考方案1】:

我遇到了与问题中描述的相同的问题。这就是为什么我想出了以下解决方案:

包含 primefaces 内置 jQuery 库(当前为 1.4.1),因为包含自己的 jQuery 库会导致 CSS 格式问题。添加 target="head" 属性允许在任何地方指定标签 - 例如使用模板时,您并不总是可以访问<head> 标签:

<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />

primefaces jQuery 库默认包含在冲突模式中。这意味着不能使用 $() 快​​捷方式。要解决此问题,请在 &lt;script&gt;&lt;h:outputScript&gt; 标记中添加以下行:

<h:outputScript target="head">
    // Add the $() function
    $ = jQuery;
    // Now you can use it
    $(document).ready(function() 
        ...
    );
</h:outputScript>

这是迄今为止我能找到的最好的解决方案,使用 primefaces 2.2.1。

【讨论】:

除了上面的 Lars 解释之外,Primefaces 不会在不使用 Primefaces 组件的页面上自动包含 jQuery,即使 Primefaces 命名空间是在 标签中定义的,所以您可以使用上面 Lars 解释的方法或更改您的组件之一以使用 Primefaces 组件实现,例如将 更改为 【参考方案2】:

为什么不将 jquery 包与 PrimeFaces 一起使用?

<h:outputScript library="primefaces" name="jquery/jquery.js" />

PrimeFaces 2.2.1 有 jQuery 1.4.4,3.0(开发中)有 1.5.1。

【讨论】:

附带说明,2.2.1 的 jquery 默认启用 noconflict,而 3.0 的 jquery 没有 noconflict on。【参考方案3】:

许多 javascript 库使用 $ 作为函数或变量名,就像 jQuery 一样。在 jQuery 的情况下,$ 只是 jQuery 的别名,因此所有功能都可以在不使用 $ 的情况下使用。以下是一些方法:

在jQuery初始化之前写jQuery.noConflict();,见下文

jQuery.noConflict();
$(document).ready(function()
   // your jQuery code   
);

创建一个不同的别名而不是 jQuery 以在脚本的其余部分中使用。

 var j = jQuery.noConflict();
 // Do something with jQuery
 j("div p").hide();

更改 $ 的所有实例:在 jQuery 代码块中将 $ 替换为 jQuery

 jQuery(document).ready(function)
       jQuery("div p").hide();
 )

将 jQuery 完全移动到另一个对象中的新命名空间。

var dom = ;
dom.query = jQuery.noConflict(true);
// Do something with the new jQuery
dom.query("div p").hide();

$ 的范围设置为本地而不是全局

    // Method 1
    jQuery(document).ready(function($)
         $("div").hide();
    );


    // Method 2
    (function($) 
      /* some code that uses $ */ 
    )(jQuery);

注意:这一点有一个缺点,您将无法访问其他库的 $() 方法。

Original Reference

【讨论】:

【参考方案4】:

我的解决方案是在默认页面中添加此代码:

<script type="text/javascript">var $j = jQuery.noConflict(true);</script>

之后我使用 jquery:

$j 

谢谢,

【讨论】:

【参考方案5】:

jQuery 有一个 'noConflict' 模式,可以很好地与其他库一起玩。我没有使用过 Primefaces 组件,所以我不确定,但如果你在无冲突模式下包含 jQuery,你的问题可能会消失。

【讨论】:

【参考方案6】:

我的经验:

我遇到了同样的问题,但从来没有使用过这两个 jquery 库。 (我使用jQuery 而不是$,但从未尝试过jQuery.noConflict())。

我的解决方案是仅使用与 primefaces 捆绑的库,如 Cagatays 回答中所述。

【讨论】:

我也一样。我只能使用 jQuery 内置的 primefaces;当使用我自己的 jQuery 库时,CSS 样式将被破坏。这意味着我只能使用 jQuery() 函数而不是 $()。【参考方案7】:

为了解决Primefaces和jQuery之间的冲突,避免导入任何外部的jQuery文件,所以为了解决这个问题,导入位于primefaces jar中的jQuery文件

<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
        <h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" />

并在您的 jQuery 代码中将 $ 替换为 jQuery。

【讨论】:

为什么不改进 39 个投票的答案,而不是创建一个几乎相同的答案?

以上是关于JQuery 与 Primefaces 冲突? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Primefaces 是不是能够从另一个域获取 jquery?

Primefaces - 当焦点在输入字段中时,Jquery 热键只工作一次

使用 PrimeFaces 手动添加/加载 jQuery 会导致未捕获的 TypeErrors

升级 primefaces.jar 中的 jquery.js 而不修改 JAR

在Primefaces脚本完成后调用我的jQuery函数

jQuery Keypad / Primefaces 键盘重新映射空格键