最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年03月20日 15:36:00   作者:  
本文主要解決了如何讓多個(gè)不同的jQuery版本在同一個(gè)頁(yè)面并存而不沖突的方法,需要的朋友可以參考下

許多的 JS 框架類(lèi)庫(kù)都選擇使用$符號(hào)作為函數(shù)或變量名,jQuery是其中最為典型的一個(gè)。在 jQuery 中,$ 符號(hào)只是 window.jQuery 對(duì)象的一個(gè)引用,因此即使 $ 被刪除,window.jQuery 依然是保證整個(gè)類(lèi)庫(kù)完整性的堅(jiān)強(qiáng)后盾。jQuery 的 API 設(shè)計(jì)充分考慮了多框架之間的引用沖突,我們可以使用 jQuery.noConflict 方法來(lái)輕松實(shí)現(xiàn)控制權(quán)的移交。

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

復(fù)制代碼 代碼如下:

jQuery.noConflict([removeAll])

缺省情況下,執(zhí)行 noConflict 會(huì)將變量 $ 的控制權(quán)移交給第一個(gè)產(chǎn)生 $ 的庫(kù);當(dāng) removeAll 設(shè)置為 true 時(shí),執(zhí)行 noConflict 則會(huì)將 $ 和 jQuery 對(duì)象本身的控制權(quán)全部移交給第一個(gè)產(chǎn)生他們的庫(kù)。

例如在 KISSY 和 jQuery 混用,并且慣用 $ = KISSY 來(lái)簡(jiǎn)化 API 操作的時(shí)候,就能夠通過(guò)這個(gè)方法解決命名沖突的問(wèn)題。

那么這個(gè)機(jī)制是如何實(shí)現(xiàn)的呢?閱讀 jQuery 源碼開(kāi)頭[2],首先做的一件事情是這樣的:

復(fù)制代碼 代碼如下:

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

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

容易理解的是,jQuery 通過(guò)兩個(gè)私有變量映射了 window 環(huán)境下的 jQuery 和 $ 兩個(gè)對(duì)象,以防止變量被強(qiáng)行覆蓋。一旦 noConflict 方法被調(diào)用,則通過(guò) _jQuery, _$, jQuery, $ 四者之間的差異,來(lái)決定控制權(quán)的移交方式,具體的代碼如下:

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

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

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

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

但無(wú)法避免的事實(shí)是可能導(dǎo)致的插件失效等問(wèn)題,當(dāng)然通過(guò)簡(jiǎn)單修改上下文參數(shù)即可恢復(fù) $ 別名:

復(fù)制代碼 代碼如下:

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

下面的示例一樣是解決這個(gè)問(wèn)題的

jQuery自誕生以來(lái),版本越來(lái)越多,而且jQuery官網(wǎng)的新版本還在不斷的更新和發(fā)布中,但是我們?cè)谝郧暗捻?xiàng)目中就已經(jīng)使用了舊版本的jQuery,比如已經(jīng)出現(xiàn)的:1.3.X、1.4.X、1.5.X、1.6.2等等。

由于項(xiàng)目的需要,必然也需要不斷的使用較新版的jQuery,但對(duì)于原來(lái)就已經(jīng)存在并已經(jīng)采用了的舊jQuery版本,我們?nèi)绾巫尪鄠€(gè)不同的jQuery版本在同一個(gè)頁(yè)面并存而不沖突呢?

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

復(fù)制代碼 代碼如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>在同一個(gè)頁(yè)面中加載多個(gè)不同的jQuery版本</title>
        <!-- 從谷歌服務(wù)器加載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+'版本添加進(jìn)來(lái)的。</p>').appendTo('body');});
            jQuery_1_6_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進(jìn)來(lái)的。</p>').appendTo('body');});
            jQuery_1_5_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進(jìn)來(lái)的。</p>').appendTo('body');});
            jQuery_1_4_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進(jìn)來(lái)的。</p>').appendTo('body');});
            jQuery_1_3_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進(jìn)來(lái)的。</p>').appendTo('body');});
        </script>
    </head>
    <body>
        在同一個(gè)頁(yè)面中加載多個(gè)不同的jQuery版本
        <br>
    </body>
</html>

相關(guān)文章

最新評(píng)論

密山市| 墨玉县| 景洪市| 芜湖市| 化德县| 麻城市| 乳源| 揭西县| 阿鲁科尔沁旗| 廊坊市| 镇康县| 云和县| 浪卡子县| 大方县| 娱乐| 乡城县| 大城县| 九台市| 洪湖市| 濮阳县| 敦煌市| 亚东县| 吕梁市| 观塘区| 新营市| 定兴县| 宣化县| 华亭县| 广汉市| 临泉县| 东丰县| 九龙城区| 陇川县| 宾阳县| 庄河市| 东乌珠穆沁旗| 衡东县| 城市| 炉霍县| 阳谷县| 寿阳县|