问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

$到底是什么-详解jQuery的$符号和init函数

发布网友 发布时间:2022-04-06 12:29

我来回答

1个回答

热心网友 时间:2022-04-06 13:58

jQuery是现在最流行的Javascript框架, $是其中最常见的符号,已经在jQuery留下了深深的烙印。接下来我会彻底分析这个符号背后隐藏的秘密。jQuery,高效,精炼,特别是对DOM元素对象操作的简化,很大程度上将前端程序员从一大堆冗余的代码解放出来,大大提高了开发效率!对多浏览器的兼容性,也最大限度让程序员摆脱各种bug的纠缠$符号作为元素选择器的简写,最早是由Prototype库使用,来简写getElementById,jQuery沿袭这一理念,并发扬光大,使$符号成为了jQuery最别具一格的特点。那么在jQuery中,$符号到底是啥?熟悉jQuery的人应该知道,几乎jQuery所有操作,都是从$符号开始,当作为元素选择器的时候,操作结果返回的是一个jQuery对象。那么,现在就看jQuery类的构造函数的主要代码jQuery对象的构造函数 var jQuery = (function() { //创建jQuery对象,给所有的jQuery方法提供统一的入口,避免繁琐难记 var jQuery = function( selector, context ) { //jQuery的构造对象,调用了jQuery.fn.init方法 //最后返回jQuery.fn.init的对象 return new jQuery.fn.init( selector, context, rootjQuery ); }, ..... //定义jQuery的原型,jQuery.fn指向jQuery.prototype对象 jQuery.fn = jQuery.prototype = { //重新指定构造函数属性,因为默认指向jQuery.fn.init constructor: jQuery, init: function( selector, context, rootjQuery ) {.....}, ...... } ...... //返回jQuery变量,同时定义将全局变量window.jQuery和window.$指向jQuery return (window.jQuery = window.$ = jQuery); })(); 从以上jQuery的主体结构,我们可以看出,当首次执行完毕后,全局变量$和jQuery,都是指向了var jQuery=function(selector,context){}这个函数,这里,就可以下个结论,$就是jQuery的别名,实际调用jQuery.fn.init。再看看var jQuery=function(selector,context){}这个构造函数,为什么里面不直接返回jQuery的对象?而是调用另外一个方法呢?假如直接返回对象的话,每次使用jQuery对象,都要new jQuery() 这样的话,十分不方便,直接将new 这个操作封装在jQuery构造函数里面,简化了实例化的操作,同时,jQuery通过了jQuery或者$符号,统一了接口,方便代码的编写,化繁为简,提高效率。那么jQuery类具体是如何构造的?居然能支持各种参数形式的调用直接上jQuery.fn.init的“辕马”,jQuery的真实构造器,我们就可以完全清楚了init源码 /*所有查找或生成元素的结果,封装为jQuery对象数组返回. */ init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // 1)处理 $(""), $(null), or $(undefined) //this指向jQuery对象 if ( !selector ) { return this; } // 2)处理 $(DOMElement) //selector.nodeType得知为DOM元素,如果是DOM元素直接放进jQuery对象数组中 if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } //3)body元素只出现一次, 优化查找 if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = "body"; this.length = 1; return this; } //4)如果是字符串,有六种情况, /* *(1)单个html元素 不带属性对象字面量 :createElement + merge *(2)单个html元素 带属性对象字面量 :createElement + attr + merge *(3)多个html元素 :buildFragment + merge *(4)#id 不带context :getElementById或者getElementById + Sizzle *(5)#id 带context :Sizzle *(6)experession string :Sizzle *(7)标签选择器 :Sizzle(内置getElementByTagName) */ if ( typeof selector === "string" ) { // 判断是否为HTML string 还是 ID //如果是HTML strings match[1] 非空 //如果是ID strings match[1] 空 //quickExpr = /^(? jQuery.clone(ret.fragment) : ret.fragment).childNodes; } //将生成结果selector 合并到jQuery对象中 return jQuery.merge( this, selector ); // 处理$("#id"),例如$("#xxx"); } else { elem = document.getElementById( match[2] ); if ( elem && elem.parentNode ) { //处理IE和Opera ID 与 Name 混淆的bug,使用Sizzle查找 if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // 否则,简单插入jQuery对象数组 this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // 处理 $(expr, $(...)),使用Sizzle查找,例如$("div"),$('div > a'),$('div,a'),$('div:first') } else if ( !context || context.jquery ) { return (context || rootjQuery).find( selector ); // 处理: $(expr, context),例如$('div a');或者$('a','div')或者$('div').find('a'); } else { return this.constructor( context ).find( selector ); } //5)处理: $(function),设置DOM载的时候绑定的函数,等同于$().ready(){foo} } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } //6)处理:$($(...)),完成克隆jQuery对象的简单参数,具体由makeArray完成 if (selector.selector !== undefined) 完成加{ this.selector = selector.selector; this.context = selector.context; } //使用makeArray,为jQuery对象添加元素,例如$([1,2]); return jQuery.makeArray( selector, this ); }, 从源码可以看出,jQuery 通过各种条件判断和强大的正则表达式,实现了各种参数的调用。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
和面的和是什么读音? win10 应用打不开。全都打不开。 进入win10打不开软件 win10电脑软件都打不开是什么原因win10突然软件都打不开软件是怎么回事... 软件打不开怎么办win10电脑点不开软件最简单办法 请问下,离厦门市岛内的台湾路的国联大厦最近的建设银行和农业银行... 从巴黎都市到建设银行怎么坐公交车,最快需要多久 东莞万江官桥窖离建设银行哪路车最近? 建行七支分行有那些公交车经过 佛山哪里有飞越丛林拓展 qq背景怎样装扮自定义 最近做梦两次周公解梦说有困难出现阻挡成功,还说灾难降临,请问这是怎么回事,怎么办? 贷款合同可以找人代替写么?付不付相应的法律责任? 我和妻子贷款买房,签贷款合同时我很有可能不在家,能不能办个委托让妻子代为签字? 办理生源地助学贷款 要签合同 父母和我又不在老家 可以让亲戚代替签订贷款合同么 贷款合同可以代签字吗 贷款合同能代签不? win8系统怎么把QQ聊天小视频保存在电脑 怎样可以把QQ里接收的视频保存到我的电脑里 贷款合同能由他人代为签字吗 中介代签贷款合同严重违规是怎么回事? 代签贷款协议需要负法律责任么 别人贷款找自己代签字会不会受法律责任 代签的借款合同有效吗? 帮别人贷款怎么跟对方签协议 安卓动态壁纸选择器总是说意外终止,到底是怎样获得ROOT权限啊? 苹果手机电池鼓包了该怎么办?可不可以放冰箱?成都城隍庙哪修 海信(成都)冰箱有限公司怎么样? 海尔冰箱高端品牌“卡萨帝”什么高端品牌,没有一个月就坏了, 新飞冰箱 成都专卖店 为什么我的电脑在启动时和进入安全模式下不能显示全屏呢? 为什么我的电脑在启动时和进入安全模式下不能显示全屏 怎么调节安全模式中显示器屏幕大小 为什么在安全模式下玩CS不能全屏 电脑进入安全模式分辨率太大根本看不到,调不了东西怎么办? 如何更新电脑密码 为什么更改电脑密码总是显示“无法更新为新密码”? 计算机更改密码怎么弄 联想打印机7105怎么调颜色的深浅 融资融劵维持担保比例2.3116 是多少 到警戒线了吗 融资融券逐日盯市的线是多少? 联想打印机打出来的字颜色太浅 怎样给联想m2051的打印机把墨色加深 融资融劵维持担保比例2.3116是多少到警戒线了吗 联想7205打印机怎样把墨色加深 融资融券取保线是多少? 火柴棍重力感应动态壁纸怎么安到桌面? 薯片对身体的危害有哪些 经常吃薯片会对身体造成什么危害 薯片有什么危害