麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

jquery插件沖突(jquery.noconflict)解決方法分享

2019-11-20 20:55:32
字體:
來源:轉載
供稿:網友

許多的 JS 框架類庫都選擇使用$符號作為函數或變量名,jQuery是其中最為典型的一個。在 jQuery 中,$ 符號只是 window.jQuery 對象的一個引用,因此即使 $ 被刪除,window.jQuery 依然是保證整個類庫完整性的堅強后盾。jQuery 的 API 設計充分考慮了多框架之間的引用沖突,我們可以使用 jQuery.noConflict 方法來輕松實現控制權的移交。

jQuery.noConflict 方法包含一個可選的布爾參數[1],用以決定移交 $ 引用的同時是否移交 jQuery 對象本身:

復制代碼 代碼如下:

jQuery.noConflict([removeAll])

缺省情況下,執行 noConflict 會將變量 $ 的控制權移交給第一個產生 $ 的庫;當 removeAll 設置為 true 時,執行 noConflict 則會將 $ 和 jQuery 對象本身的控制權全部移交給第一個產生他們的庫。

例如在 KISSY 和 jQuery 混用,并且慣用 $ = KISSY 來簡化 API 操作的時候,就能夠通過這個方法解決命名沖突的問題。

那么這個機制是如何實現的呢?閱讀 jQuery 源碼開頭[2],首先做的一件事情是這樣的:

復制代碼 代碼如下:

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,

// Map over the $ in case of overwrite
_$ = window.$,

容易理解的是,jQuery 通過兩個私有變量映射了 window 環境下的 jQuery 和 $ 兩個對象,以防止變量被強行覆蓋。一旦 noConflict 方法被調用,則通過 _jQuery, _$, jQuery, $ 四者之間的差異,來決定控制權的移交方式,具體的代碼如下:

noConflict: function( deep ) {
                if ( window.$ === jQuery ) {
                        window.$ = _$;
                }

                if ( deep && window.jQuery === jQuery ) {
                        window.jQuery = _jQuery;
                }

                return jQuery;
        }
再來看上面所說的參數設定問題,如果 deep 沒有設置,_$ 覆蓋 window.$,此時 jQuery 別名 $ 失效,但 jQuery 本身完好無損。如果有其他類庫或代碼重新定義了 $ 變量,它的控制權就完全交接出去了。反之如果 deep 設置為 true 的話,_jQuery 覆蓋 window.jQuery,此時 $ 和 jQuery 都將失效。

這種操作的好處是,不管是框架混用還是 jQuery 多版本共存這種高度沖突的執行環境,由于 noConflict 方法提供的移交機制,以及本身返回未被覆蓋的 jQuery 對象,完全能夠通過變量映射的方式解決沖突。

但無法避免的事實是可能導致的插件失效等問題,當然通過簡單修改上下文參數即可恢復 $ 別名:

復制代碼 代碼如下:

var query = jQuery.noConflict(true);
(function ($) {
// 插件或其他形式的代碼,也可以將參數設為 jQuery
})(query);

下面的示例一樣是解決這個問題的

jQuery自誕生以來,版本越來越多,而且jQuery官網的新版本還在不斷的更新和發布中,但是我們在以前的項目中就已經使用了舊版本的jQuery,比如已經出現的:1.3.X、1.4.X、1.5.X、1.6.2等等。

由于項目的需要,必然也需要不斷的使用較新版的jQuery,但對于原來就已經存在并已經采用了的舊jQuery版本,我們如何讓多個不同的jQuery版本在同一個頁面并存而不沖突呢?

其實,利用jQuery.noConflict()特性,我們不僅可以讓jQuery與其他的JS庫并存,比如Prototype。也可以與jQuery本身的其他不同版本并存而不沖突。

復制代碼 代碼如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>在同一個頁面中加載多個不同的jQuery版本</title>
        <!-- 從谷歌服務器加載jQuery最新版本 -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
        <script type="text/javascript">
            var jQuery_New = $.noConflict(true);
        </script>
        <!-- 加載jQuery1.6.2版本 -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
        <script type="text/javascript">
            var jQuery_1_6_2 = $.noConflict(true);
        </script>
        <!-- 加載jQuery1.5.2版本 -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        <script type="text/javascript">
            var jQuery_1_5_2 = $.noConflict(true);
        </script>
        <!-- 加載jQuery1.4.2版本 -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript">
            var jQuery_1_4_2 = $.noConflict(true);
        </script>
        <!-- 加載jQuery1.3.2版本 -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript">
            var jQuery_1_3_2 = $.noConflict(true);
        </script>
        <script type="text/javascript">
            alert(jQuery_New.fn.jquery);
            alert(jQuery_1_6_2.fn.jquery);
            alert(jQuery_1_5_2.fn.jquery);
            alert(jQuery_1_4_2.fn.jquery);
            alert(jQuery_1_3_2.fn.jquery);

            jQuery_New(function($){$('<p>我是最新的'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
            jQuery_1_6_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
            jQuery_1_5_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
            jQuery_1_4_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
            jQuery_1_3_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
        </script>
    </head>
    <body>
        在同一個頁面中加載多個不同的jQuery版本
        <br>
    </body>
</html>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日日草夜夜操 | 国产午夜精品久久久久久免费视 | www.99tv | 国产精品久久av | 97久色| 成人福利视频 | 久久国产精品免费视频 | 99精品国产在热久久婷婷 | av免播放| 国产亚洲精品综合一区 | 欧美a∨一区二区三区久久黄 | 免费一区区三区四区 | 性少妇videosexfreexx入片 | 久久久精品视频免费看 | 国产交换3p国产精品 | 欧美成人高清视频 | www.精品在线 | 国产成人精品免费视频大全最热 | 在线影院av| 国产精品久久久久久久久粉嫩 | 国产精品爆操 | 成人毛片100部 | xxxx18韩国护士hd老师 | 一区二区三高清 | 国产羞羞视频在线观看免费应用 | 国产精品自拍片 | 欧美一级成人一区二区三区 | 国产精品一区免费在线观看 | 毛片国产| 国产啊v在线观看 | 空姐毛片 | 久久综合一区二区 | 一区二区三区欧美在线 | 精品人伦一区二区三区蜜桃网站 | 97伦理| 免费观看高清视频网站 | 国产精品免费久久久 | 中文字幕一区在线观看视频 | 精品亚洲视频在线 | 狠狠婷婷综合久久久久久妖精 | 天天夜夜草 |