jQuery中 $ 符號的沖突問題


jQuery中  $ 符號的沖突問題是常見問題之一。
 
在jQuery中, $是jQuery的別名,為了書寫方便,我們更習慣用$('#id')這一類的方式來書寫代碼。當同一頁面引用了jQuery多個版本或者jQuery與某些其他js庫產生沖突,控制台就會報錯。
 
  1. 同一個頁面多個版本沖突解決辦法
 
你可能會問,為什么在一個頁面上會引用多個版本的jQuery,只引用一個不就好了嗎?
 
答案是:不行。一般要用到兩個(或以上)版本的jQuery庫的原因是:現有的網站已經用了舊版本的jQuery以及相關插件,直接將jQuery升級到新版本會導致這些基於舊版本jQuery的插件不能工作,除非你能把這些插件全部升級,或者等各個插件的作者發布支持新版本jQuery的插件版本。

  

解決辦法:使用 jQuery.noConflict([extreme])方法。
               比如我引用的是jquery-1.11.0.js和jquery-1.5.0.js。
<script src="jquery-1.5.0.js"></script>
<script src="jquery-1.11.0.js"></script>
<script>
    console.log($.fn.jquery); //'1.11.0'
    var $jq = jQuery.noConflict(true);
    console.log($.fn.jquery);  //'1.5.0'
</script>
可以看到jQuery.noConflict將變量 $ 的控制權讓渡給了1.5.0版本的jQuery庫。而要使用1.11.0的版本則要用 $jq() 代替。 
 
但是引入了兩個版本的jQuery后,代碼很亂,導致別人難以理解甚至誤刪了一些重要代碼怎么辦?
改進的方法是:
先直接引用新版的jQuery庫。
<script src="jquery-1.11.0.js"></script>
<script src="myJS.js"></script>
把我們寫的腳本myJS.js中的主體內容寫在立即調用函數里頭,引用的是新的版本的jQuery。
//myJS.js
(function() {
    //myJS.js的代碼,引用的是v1.11.0
})();
再寫一個立即調用函數,把舊版本的jQuery代碼嵌進去(壓縮代碼只有幾行)。然后在里面寫代碼,此時變量$所引用的前面嵌進去的jQuery
//myJS.js
(function () {
    //...此處省略/jquery1.5.0
    //jquery1.5.0的壓縮代碼

  var $ = jQuery.noConflict(true);
   //此處開始寫的$()所引用的是jquery1.5.0

})();
 
Ps:需要檢查jQuery的協議是否允許我們把jQuery源碼直接嵌入我們自己的JavaScript代碼
 
 

       2. 同一頁面jQuery和其他js庫沖突解決方法

 

依然可以使用jQuery.noConflict將變量$的控制權讓渡給其他js庫。

如果jQuery在其他js庫前,不需要使用noConflict。 

<!-- 引入 jquery庫 -->
<script src="jquery-1.11.0.js"></script>
<script type="text/javascript">
    var $jq = $;
    console.log($.fn.jquery);    //'1.11.0'
</script>
<!-- 引入 其他庫-->
<script type="text/javascript">
     $ = {
            fn:{
               jquery:"otherJS"
            }
        };
</script>
<script type="text/javascript">        
     console.log($.fn.jquery);   //otherJS
     console.log($jq.fn.jquery);   //'1.11.0'
</script>
如果在其他js庫之后,用noConflict讓渡。
<!-- 引入 其他庫-->
<script type="text/javascript">
    $ = {
        fn:{
             jquery:"otherJS"
        }
    };
</script>
<!-- 引入 jquery庫 -->
<script src="jquery-1.11.0.js"></script>

<script type="text/javascript">    
    console.log($.fn.jquery);    //'1.11.0'
    var $180 = $.noConflict();   //解除沖突
    console.log($.fn.jquery);   //otherJS
    console.log($jq.fn.jquery);   //'1.11.0'
</script>
它的缺點是:在接下來的js代碼中只要引用到jQuery就必須把$換成$jq。
 
②ready函數是jquery的入口函數
可以將
$(document).ready(function() {...})

替換成:

jQuery(document).ready(function($) {...})
它的缺點是:只對ready嵌套內的代碼有效,如果ready函數外還有一些子函數,對嵌套外的代碼是無效的。
 
 
③把$作為參數傳進去
(function($) { 
    //你的js代碼 
})(jQuery);

或者

jQuery(function($){ 
  //你的js代碼
}
你的js代碼可以包括上面說到的ready函數和子函數。在用jQuery寫公共組件的時候,使用這種方式既能避免$沖突,又無需要求使用公共組件的人修改自己的代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM