2011-03-28 251 views
33

我在JSF页面的标题中包含了JQuery1.5。在该页面中,有一堆已经编码的Primefaces组件。我已经包含在网页标题中的Jquery.js后,一些primefaces像<p:commandButton>组件失去他们的皮肤和<p:fileUpload>变得看起来像正常的JSP <input type="file">和完全失去了AJAX功能。JQuery与Primefaces冲突吗?

是否有使用jQuery安全以及primefaces(不冲突)的方式?

+0

我不明白为什么这个问题被标记为_这个问题之前曾被问过。在这个问题发生两年后,问题就出现了。 – 2017-06-19 20:57:20

回答

49

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

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

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

的primefaces jQuery库默认情况下,在冲突模式包括在内。这意味着$()快捷键不能被使用。为了克服这个问题,包括在<script><h:outputScript>标签下面一行:

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

这是我能挖掘出到目前为止,使用primefaces 2.2.1的最佳解决方案。

+0

非常感谢:) – Selvin 2011-04-01 10:15:51

+3

除了上面的Lars解释之外, Primefaces在没有使用Primefaces组件的页面上不会自动包含jQuery,即使在标记中定义了Primefaces命名空间,您也可以使用方法由上面的Lars解释,或更改其中一个组件以使用Primefaces组件实现,例如将更改为。 – 2013-04-06 15:13:15

3

jQuery有一个“noConflict”模式这使得它能够很好地由侧与其他库玩侧。我没有使用Primefaces组件,所以我不确定,但如果您在noconflict模式中包含jQuery,您的问题可能会消失。

6

许多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

43

为什么不使用与PrimeFaces jQuery的包?

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

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

+4

作为一个方面说明,2.2.1的jquery默认启用了noconflict,3.0没有noconflict。 – 2011-03-28 11:09:11

3

我的经验:

我有同样的问题,从来没有得到它用jQuery的库工作。 (我用jQuery,而不是$但从未试过jQuery.noConflict())。

我的解决方案是只使用与Cagatays答案中所述的primefaces捆绑在一起的库。

+0

同样适用于我。我只能使用内置jQuery的primefaces;当使用我自己的jQuery库时,CSS样式将被损坏。这意味着我只能使用jQuery()函数而不是$()。 – 2011-04-01 07:01:43

6

我的解决办法是在默认页面添加以下代码:

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

之后使用jQuery有:

$j 

感谢,

1

解决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代码中用$替换$。

+0

为什么不改进39 upvoted的答案,而不是创建一个几乎相同的答案? – Kukeltje 2016-03-04 17:39:18