• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
邹天得
博客园    首页    新随笔    联系   管理    订阅  订阅
JQuery/Underscore等javascript框架中noConflict()的使用和实现原理

http://blog.csdn.net/aitangyong/article/details/44200751

 

一般的JavaScript框架,都是通过向全局对象window中注入自己的属性实现的。比如jQuery向window中添加"$"对象,Underscore向window对象中添加"_"对象。如果在框架加载之前,已经存在这些全局变量呢,会怎么样呢?

  1. <script>  
  2.     var $ = "$";  
  3. </script>  
  4. <script src="jquery-1.10.2.js"></script>  
  5. <script>  
  6.     alert($ === "$");//false  
  7.     alert($().jquery);//1.10.2  
  8. </script>  

很显然$被jquery框架占用了,我们之前定义的$变量值被覆盖。如果既想使用JQuery框架,又想使用之前定义的$变量。那么noConflict()函数就派上用场了。

 
  1. <script>  
  2.     var $ = "$";  
  3. </script>  
  4. <script src="jquery-1.10.2.js"></script>  
  5. <script>  
  6.     var stillJQuery = $.noConflict();  
  7.     alert(stillJQuery().jquery);//1.10.2  
  8.     alert($ === "$");//true  
  9. </script>  

一般的javascript框架都是如下结构,实现原理如下:

 
  1. (function(window) {  
  2. // 保存之前数据  
  3. var _$E = window.$E;  
  4. var myplugin = {"name":"aty"};  
  5.     myplugin.noConflict = function(){  
  6.         window.$E = _$E;  
  7. return myplugin;  
  8.     };  
  9. // 向全局对象注册$E  
  10.     window.$E = myplugin;  
  11. })(window);  

jQuery实现noConflict源码如下:

 1 jQuery.extend({
 2     noConflict: function( deep ) {
 3         if ( window.$ === jQuery ) {
 4             window.$ = _$;
 5         }
 6 
 7         if ( deep && window.jQuery === jQuery ) {
 8             window.jQuery = _jQuery;
 9         }
10 
11         return jQuery;
12     },
posted on 2017-07-16 10:18  邹天得  阅读(267)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3