zoukankan      html  css  js  c++  java
  • jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

    jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

    最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑的童鞋能有一点点的帮助(我是从一个小白的角度出发,感觉挺容易理解的,顺带说下视频中jquery源码选取的是2.0.3版本)。

     

    我们都知道,使用$和jQuery效果是一样的,比如:

    1 <button id="btn">点我</button>
    2 $("#btn").click(function(e) {
    3     console.info(e.type);
    4 });
    5 jQuery("#btn").click(function(e) {
    6     console.info(e.type);
    7 });

    为什么是这样子呢?因为jquery源码中是包在一个立即调用的函数表达式中(一个闭包),对外暴露的接口就是$和jQuery,将这两个属性绑定在window下:

    1 window.jQuery = window.$ = jQuery;

    因为别的库也用$或者jQuery符号,比如prototype.js,所以同时引prototype和jquery就有可能造成命名冲突,jquery解决命名冲突问题的代码如下:

     1 (function(window, undefined) 
     2         
     3     
     4     var
     5     // Map over jQuery in case of overwrite
     6         _jQuery = window.jQuery,
     7 
     8     // Map over the $ in case of overwrite
     9         _$ = window.$;
    10 
    11     jQuery.noConflict = function( deep ) {
    12         if ( window.$ === jQuery ) {
    13             window.$ = _$;
    14         }
    15 
    16         if ( deep && window.jQuery === jQuery ) {
    17             window.jQuery = _jQuery;
    18         }
    19 
    20         return jQuery;
    21     };
    22 })(window);

    noConflict是jquery通过extend扩展的工具方法(静态方法),与ajax方法一样,调用方法为$.noConflict()或者jQuery.noConflict(),不带参数是对$的处理,带参数true时是对jQuery的处理,这个函数返回值就是jQuery对象。jquery源码中用_jQuery和_$来保存全局中jQuery和$的值,因为jquery对外接口的时候将$和jQuery全部挂在window上,window.$和jQuery始终是相等的,都等于jquery源码中的jQuery对象,所以jquery会放弃对$的使用(我不用$了,你们用吧),将_$中保存的值赋给window.$;如果加一个参数true的时候,jquery会放弃jQueryde的使用,将_jQuery中保存的值赋给window.jQuery(2种情况都会返回jQuery对象,我们还是可以用继续用$来用别的库的方法,并且用另外的变量来保存返回的jQuery对象来使用jquery的方法。

     1 <script>
     2     var  $  = {
     3         sayName: function() {
     4             console.info('我是prototype中的$');
     5         }
     6     };
     7 </script>  
     8 <script src="jquery.2.0.3.js"></script>    
     9 <script>
    10     var iAmRealJQ = $.noConflict();
    11     $.sayName(); // 我们还可以使用自定的$对象的方法
    12     console.info(iAmRealJQ);  // 我们还可以用jquery源码的jQuery对象来实例化一个新对象 -->
    13 </script>
     1 <script>
     2     var  jQuery  = {
     3         sayName: function() {
     4             console.info('我是某个库中的jQuery');
     5         }
     6     };
     7 </script>
     8 <script src="jquery.2.0.3.js"></script>
     9 <script>
    10     var iAmRealJQ = jQuery.noConflict(true);
    11     jQuery.sayName(); // 我们还可以使用自定的jQuery对象的方法
    12     console.info(iAmRealJQ);  // 我们还可以用jquery源码的jQuery对象来实例化一个新对象 
    13 </script>
  • 相关阅读:
    CF 980D Perfect Groups(数论)
    CF 983B XOR-pyramid(区间dp,异或)
    CF 984C Finite or not? (数论)
    CF 979D Kuro and GCD and XOR and SUM(异或 Trie)
    (可能)常用打比赛网站
    排序工作量之新任务(SHOI2001)
    【图楼】长期图楼~~不定期更新
    【题解】SHOI2014概率充电器
    【题解】NOIP2015推销员
    [NOI2015][bzoj4197] 寿司晚宴 [状压dp+质因数]
  • 原文地址:https://www.cnblogs.com/hanshuai/p/6766202.html
Copyright © 2011-2022 走看看