如何解决与primefaces jquery的冲突

Posted

技术标签:

【中文标题】如何解决与primefaces jquery的冲突【英文标题】:How to solve a conflict with primefaces jquery 【发布时间】:2014-10-19 22:34:44 【问题描述】:

我正在用primefaces 5开发一个项目,一页使用需要jquery的js文件,但显示Uncaught TypeError: undefined is not a function,但是当我将我的jquery源从<h:outputScript library="primefaces" name="jquery/jquery.js" target="head"/>更改为

<h:head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js"></script>
</h:head>

工作正常,但我失去了许多 primefaces 功能,例如 contexMenu

我该如何解决这个冲突?

这是我的 javascript 文件:

(function($, $S) 
//$ jQuery
//$S window.localStorage
//Variables Declaration
var $board = $('#notesForm\\:board'),
//Board where the Posticks are sticked
Postick, //Singleton Object containing the Functions to work with the LocalStorage
len = 0, //Length of Objects in the LocalStorage
currentNotes = '', //Storage the html construction of the posticks
o; //Actual Postick data in the localStorage

//Manage the Posticks in the Local Storage
//Each postick is saved in the localStorage as an Object 
Postick = 
    add : function(obj) 
        obj.id = $S.length;
        $S.setItem(obj.id, JSON.stringify(obj));
    ,

    retrive : function(id) 
        return JSON.parse($S.getItem(id));
    ,

    remove : function(id) 
        $S.removeItem(id);
    ,

    removeAll : function() 
        $S.clear();
    

;

//If exist any postick, Create it/them
len = $S.length;
if (len) 
    for (var i = 0; i < len; i++) 
        //Create all posticks saved in localStorage
        var key = $S.key(i);
        o = Postick.retrive(key);
        currentNotes += '<div class="postick"';
        currentNotes += ' style="left:' + o.left;
        currentNotes += 'px; top:' + o.top;
        //data-key is the attribute to know what item delete in the localStorage
        currentNotes += 'px"><div class="toolbar"><span class="delete" data-key="'
                + key;
        currentNotes += '">x</span></div><div contenteditable="true" class="editable">';
        currentNotes += o.text;
        currentNotes += '</div>';
    

    //Append all the posticks to the board
    $board.html(currentNotes);


//When the document is ready, make all posticks Draggable
$(document).ready(function() 
    $(".postick").draggable(
        cancel : '.editable',
        "zIndex" : 3000,
        "stack" : '.postick'
    );
);

//Remove Postick
$('span.delete').live('click', function() 
    if (confirm('Are you sure you want to delete this Note?')) 
        var $this = $(this);
        //data-key is the attribute to know what item delete in the localStorage
        Postick.remove($this.attr('data-key'));
        $this.closest('.postick').fadeOut('slow', function() 
            $(this).remove();
        );
    
);

//Create postick
$('#notesForm\\:btn-addNote')
        .click(
                function() 
                    $board
                            .append('<div class="postick" style="left:20px;top:70px"><div class="toolbar"><span class="delete" title="Close">x</span></div><div contenteditable class="editable"></div></div>');
                    $(".postick").draggable(
                        cancel : '.editable'
                    );
                );

//Save all the posticks when the user leaves the page
window.onbeforeunload = function() 
    //Clean the localStorage
    Postick.removeAll();
    //Then insert each postick into the LocalStorage
    //Saving their position on the page, in order to position them when the page is loaded again
    $('.postick').each(function() 
        var $this = $(this);
        Postick.add(
            top : parseInt($this.position().top),
            left : parseInt($this.position().left),
            text : $this.children('.editable').text()
        );
    );

)(jQuery, window.localStorage);

【问题讨论】:

primefaces 默认包含 jqueryui 吗?看起来您的第一个版本没有包含 ui 库,这意味着 draggable 未定义 感谢引导的答案,当用户按下右键时我必须添加一个便笺,解码我上面发布的代码是 js 便笺代码,如果我使用 primefaces jquery,contextMenu 会检测到正确单击但粘滞便笺代码不运行,如果我使用 jquery 链接粘滞便笺代码工作但上下文菜单没有,这是笔记代码工作:pastie.org/9504320 这是 contextMenu 工作:@987654322 @ 在最后一个便签显示 Uncaught TypeError: undefined is not a function . BalusC 我在网上找到了代码,这是真的。 google chrome 调试器在此行中显示错误 $('span.delete').live('click', function() 我刚从“live”转到“on”并且可以工作,但现在我必须刷新页面以调用删除方法 这是另一个问题,但原版已修复,非常感谢,我会更加注意版本。请创建一个答案以设置为已解决 【参考方案1】:

PrimeFaces 作为一个基于 jQuery 的 JSF 组件库已经随 jQuery(和 UI)一起提供。一旦您在页面上使用 PrimeFaces 组件,PrimeFaces 就会自行加载它们。绝对没有必要手动加载另一个 jQuery 文件。正如你所经历的那样,它只会在所有颜色上发生冲突。

如果您确实想在不一定包含 PrimeFaces 组件的页面上使用 jQuery/UI,因此 jQuery/UI 不一定会自动包含,那么您需要手动包含 PrimeFaces 捆绑的 jQuery,如下所示:

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

注意:这不会导致重复包含。 JSF/PrimeFaces 能够检测到您已经手动声明了它们并且不会自动包含另一个。

或者,如果您真的想升级 PrimeFaces 捆绑的 jQuery/UI 到较新版本,则将这些文件准确放在以下位置和文件名:

WebContent
 |-- resources
 |    `-- primefaces
 |         `-- jquery
 |              |-- jquery.js          <-- newer jQuery version
 |              `-- jquery-plugins.js  <-- newer jQuery UI version
 :

当在 WAR 而不是 JAR 中找到 JSF 资源时,WAR 中的资源将比 JAR 中的资源具有更高的加载优先级。

如果您仍然面临Uncaught TypeError 错误,请确保您在 Internet 上找到的 jQuery sn-p 与 PrimeFaces 捆绑的 jQuery 版本兼容。 PrimeFaces 5.0 附带 jQuery 1.11.0 和 jQuery UI 1.10.3。您的 sn-p 似乎针对 jQuery 1.4,并且 a lot 在 jQuery 1.11 的路径中已更改。例如 $.live() 在 1.7 中已弃用并在 1.9 中删除。另见the documentation。

【讨论】:

'手动加载另一个 jQuery 文件绝对没有意义'......今天我需要使用 jquery 自动完成方法,但我不能,因为不能与 jquery 一起运行 primefaces jquery。所以至少我认为使用它可能是有意义的。 Primefaces 有自动完成功能,但自动完成功能已经用 jQuery 实现了,所以在这种情况下,我应该用 primefaces 实现所有东西,或者只使用 jQuery【参考方案2】:

我也有像你一样的问题。确保script 声明如下例所示。不要用$(....)唱歌。使用jQuery(...)。对我来说没问题。

<h:head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js"></script>
    <h:outputScript library="primefaces" name="jquery/jquery.js" target="head"/>
    <script type="text/javascript">
        jQuery(document).ready(function(jQuery)

            ..don't use $

        );
    </script>       
</h:head>

Multiple different versions of jQuery co-existing

【讨论】:

以上是关于如何解决与primefaces jquery的冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何解决jquery与zepto冲突问题

jQuery版本之间冲突如何解决?

zepto与jquery冲突的解决

discuz教程:discuz模板js与jQuery冲突的解决方案

完美解决jQuery符号$与其他javascript 库框架冲突的问题

如何解决Jquery版本冲突[重复]