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

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

在Ubuntu上打不开GitHub的完整解决方法

《在Ubuntu上打不开GitHub的完整解决方法》当你满心欢喜打开Ubuntu准备推送代码时,突然发现终端里的gitpush卡成狗,浏览器里的GitHub页面直接变成Whoathere!警告页面... 目录一、那些年我们遇到的"红色惊叹号"二、三大症状快速诊断症状1:浏览器直接无法访问症状2:终端操作异常