jQuery源码阅读(三)--解决冲突noConflict()

2024-05-04 14:18

本文主要是介绍jQuery源码阅读(三)--解决冲突noConflict(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天一行行看jQuery代码,大体看下来,jQuery源码的顺序大概是这些内容:

  • 一些变量和函数,包括jQuery对象的创建
  • jQuery.extend和jQuery.fn.extend
  • jQuery.extend扩展的一些工具方法
  • 回调函数Callbacks,包括有add方法和fire方法
  • 延迟对象Deferred
  • jQuery.support , jQuery功能检测
  • jQuery 数据缓存,包括jQuery挂载的静态方法data(), acceptData()等,以及在jQuery对象上的方法data();
  • 队列管理,出队入队queue(),dequeue(),主要在动画中用的比较多
  • 元素的属性操作,比如attr(), removeAttr(); addClass(), removeClass(), toggleClass(); hasClass(); val()等等
  • jQuery事件jQuery.event; 有add,remove方法;还有bind, one, trigger等
  • Sizzle选择器,用来处理各种复杂的选择器,得到选中的jQuery对象或者jQuery对象集合
  • DOM元素遍历,DOM的增删改,以及包裹等等操作
  • 对DOM样式的操作,即css()方法
  • aJax功能,ajax(), getJSON(), getScript()等等
  • 动画方法,show(), hide(), toggle(), fadeTo(), animate(), stop()等等
  • 各种offset, 即获取尺寸和位置方法
  • jQuery对模块化的支持,AMD,COMMONJS等,我看的jQuery1.7.2只有对AMD的支持,后面高版本对COMMONJS也支持。

下来先看一些变量:

//在创建jQuery对象之后
rootjQuery = jQuery(document);
//这样做的主要目的是后面用的时候既能保持语义,又可以减少代码量
readyList      //与DOM加载有关;可以在ready函数中看到对readyList的使用
location = window.location;
document = window.document;
navigator = window.navigator_$ = window.$;
_jQuery = window.jQuery;  /这两个变量主要是用于解决冲突的

下来我主要想跟大家分享一下解决冲突实现原理及源码:
我们知道,在使用jQuery的时候,如果先引用了别的库,然后再引用jQuery库,为了跟别的库在使用 jQuery 的使用权。
直接调

jQuery.noConflict();
$()      //利用的是别的库;
jQuery.noConflict(true);    //不仅释放掉$的使用权,也释放掉jQuery的使用权
jQuery();  //再调jQuery时,是上一个引入的jQuery库了;或者没有

那么jQuery中的noConflict是如何实现的?

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

跟着源码缕一下思路:
假设我们在html文件中,先引入了一个其他的库,比如说prototype.js, 引入之后, 此时的window.$是prototype.js库中的。而如果后面再引入jQuery.js库,这个时候window.$和window.jQuery都是jQuery方法,相当于覆盖了原来的prototype.js库中的$

那么在noConflict函数中,就先判断window.$与jQuery是否相等,如果相等,说明这时候jQuery库中的$被覆盖掉了,这时候重置window.$,即将window.$让给之前的库。 如何得到之前库的$, 这个值是保存在 _$中的。有点绕,不过比较容易理解。
当参数deep为true时,把jQuery的使用权也让出去,逻辑跟上面是类似的。

这篇关于jQuery源码阅读(三)--解决冲突noConflict()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959391

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对