jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理
jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理
最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑的童鞋能有一点点的帮助(我是从一个小白的角度出发,感觉挺容易理解的,顺带说下视频中jquery源码选取的是2.0.3版本)。
我们都知道,使用$和jQuery效果是一样的,比如:
<button id="btn">点我</button>
$("#btn").click(function(e) {
console.info(e.type);
});
jQuery("#btn").click(function(e) {
console.info(e.type);
});
为什么是这样子呢?因为jquery源码中是包在一个立即调用的函数表达式中(一个闭包),对外暴露的接口就是$和jQuery,将这两个属性绑定在window下:
window.jQuery = window.$ = jQuery;
因为别的库也用$或者jQuery符号,比如prototype.js,所以同时引prototype和jquery就有可能造成命名冲突,jquery解决命名冲突问题的代码如下:
(function(window, undefined) var
// Map over jQuery in case of overwrite
_jQuery = window.jQuery, // Map over the $ in case of overwrite
_$ = window.$; jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
} if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
} return jQuery;
};
})(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的方法。
<script>
var $ = {
sayName: function() {
console.info('我是prototype中的$');
}
};
</script>
<script src="jquery.2.0.3.js"></script>
<script>
var iAmRealJQ = $.noConflict();
$.sayName(); // 我们还可以使用自定的$对象的方法
console.info(iAmRealJQ); // 我们还可以用jquery源码的jQuery对象来实例化一个新对象 -->
</script>
<script>
var jQuery = {
sayName: function() {
console.info('我是某个库中的jQuery');
}
};
</script>
<script src="jquery.2.0.3.js"></script>
<script>
var iAmRealJQ = jQuery.noConflict(true);
jQuery.sayName(); // 我们还可以使用自定的jQuery对象的方法
console.info(iAmRealJQ); // 我们还可以用jquery源码的jQuery对象来实例化一个新对象
</script>
jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理的更多相关文章
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
- jQuery源码中的“new jQuery.fn.init()”什么意思?
所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...
- jQuery源码中的赌博网站
前言 jQuery源码中有赌博网站? 起因是公司发的一份自查文件,某银行在日常安全运营过程中发现在部分jQuery源码中存在赌博和黄色网站链接. 链接分为好几个: www.cactussoft.cn ...
- jquery源码学习笔记三:jQuery工厂剖析
jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- Jquery源码中的Javascript基础知识(二)
接上一篇,jquery源码的这种写法叫做匿名函数自执行 (function( window, undefined ) { // code })( window ); 函数定义了两个参数window和u ...
- 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释
一.首先是最常见的闭包 (Closure) 范式自执行函数的写法,这里用匿名函数封装(构造块级作用域),避免了匿名函数内部的代码与外部之间发生冲突(如使用了相同的变量名). (function() { ...
- jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量
jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...
- jQuery源码学习扒一扒jQuery对象初使化
神奇的jQuery可以这样玩jQuery("#id").css()或 jQuery("#id").html() 这么玩jQuery("#id" ...
随机推荐
- C++学习day1
1. 有符号整数 对于有符号整数,最高位为0表示正数,为1表示负数 负数的绝对值为除最高位外,其余取反再加1 int 字节数:4,取值范围:-232~232-1 最大值为232-1 最小值即为 000 ...
- boost::function 介绍
本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1. 介绍 Boost.Func ...
- Laravel 怎么使用资源控制器delete方法
### 在视图上,想删除某个数据,而控制器是使用了resources controller的 那么在删除数据的时候,还是有些需要注意的地方 ### 视图上: <a href="java ...
- [JavaScript]iframe的contentWindow
HTMLIFrameElement.contentWindow返回的是HTMLIFrameElement类型元素的window对象 通过此对象可以修改iframe实体内的window行为 <if ...
- 5)django-模板
django模板显示页面 一:语法使用 1)变量:{{变量名}} 2)for循环 {% for row in userlist%} ...
- Jenkins五 配置tomcat
一:jdk安装 查看系统自带jdk版本并卸载 [root@localhost conf]# rpm -qa|grep jdkjdk1.8-1.8.0_201-fcs.x86_64 移除: yum re ...
- 使用Eclipse进行Makefile项目
最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考. ...
- SecureCRT中sqlplus,使用Backspace删除时 ^H^H
平时习惯用Backspace删除输入错误,但是在SecureCRT中使用是,却是: SQL> sele^H^H 网上有几个方法,觉得改SecureCRT的配置最方便.
- Confluence 6 编辑站点欢迎消息使用模板编辑器的小提示
站点欢迎消息是一个模板而不是一个页面,所以你需要使用模板编辑器来对你的消息进行编辑. 你可以和在你 Confluence 中其他页面中一样,在站点欢迎消息模板中添加文本,连接和宏.但是添加图片的话会有 ...
- java多线程快速入门(十八)
Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...