认识第一个比较重要的方法jQuery.fn.init
源码如下:
selector = selector || document;
if ( selector.nodeType ) {
this[0] = selector;
this.length = 1;
return this;
}
selector = selector || document 暗示了如果$(),那么就相当于$(document)
selector.nodeType用来判断是否是一个domElement对象,如果是直接将本对象包装成jquery对象返回,这里要说明一点,实际jquery对象是一个伪数组或者说是一个功能异常强大的集合,你可以通过下标去访问里面的元素和length属性,但它不会像数组一样去帮你维护里面的元素,比如你将length设为空,它不会帮你将里面的元素清空,因为他是一个伪造的。
if ( typeof selector == "string" ) {
....
}else if ( jQuery.isFunction( selector ) )
return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
return this.setArray(jQuery.makeArray(selector));
判断是否是字符串,情况比较多,稍后讨论,先看简单的,好像也不太简单
jQuery.isFunction( selector ) 判断传进来的是否是一个函数
isFunction函数体如下:
return !!fn && typeof fn != "string" && !fn.nodeName &&
fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
!!fn强制返回boolean型,然后否定了它不是字符串,不是dom元素,不是数组,然后用一个正则进行验证,为什么要加个"^[\s[]?"让我很困惑,因为这是一个全局函数所以才判断这么多,实际上就这个逻辑关系,只用最后一个验证就行了,因为前面已经都有对应的判断了,不过这个方法还是相当具有价值的,多多品味
jQuery( document )返回是一个骨子里是document的jquery对象
[ jQuery.fn.ready ? "ready" : "load" ]如果jQuery.fn存在ready属性,返回[ready]否则返回[load],这种写法很值得借鉴,简洁高效
下面找寻load,ready方法
load : (约2420) 牵涉事件,暂时搁置一下
ready : (约2282)
jQuery.fn.ready: function(fn) {
bindReady(); //关于事件暂时不讨论
if (jQuery.isReady)
fn.call(document, jQuery);
else
jQuery.readyList.push(function() {
return fn.call(this, jQuery);
});
return this;
}
jquery有一套快速的检查文档是否加载完毕的例子,这个要比传统的window.onload要快,他的实现是通过一个计时器,不停的检查,知道加载好后将jQuery.isReady属性等于true
,所以上面这段代码意思就是,如果没有加载好就将其放入readyList数组中,当前的this指向调用ready的jquery对象(即$(document)),而且这个函数还被注入了jQuery参数,所以想查看readyList里面的个数 $(function(j){alert(j.readyList.length)}),如果dom已经加载好,就会直接执行
当dom从未加载好到加载好后,会调用全局的jQuery.ready(约2304),将isReady改为true,然后遍历readyList数组,执行里面的方法,一定要把最后页面执行$()里面function这个过程想通
下一个return this.setArray(jQuery.makeArray(selector));
setArray: function(elems) {
this.length = 0;
Array.prototype.push.apply(this, elems);
return this;
}
因为是伪数组,所以记住在改变数组时要自己维护length,剩下就不解释了,属于借鸡生蛋的做法
makeArray: function(array) {
var ret = [];
if (array != null) {
var i = array.length;
if (i == null || array.split || array.setInterval || array.call)
ret[0] = array;
else
while (i)
ret[--i] = array[i];
}
return ret;
}
注意有length属性不仅仅是array,还有arguments,function,伪数组(例如jquery对象),window。i == null主要是针对没有length属性的,比如object,12,true这样的基本类型,这函数的意义就是无论什么将它构造成一个数组。作者之所以分成两个方法,是考虑到粒度的问题,这种粒度对后面的重用会大有帮组
最麻烦的:if ( typeof selector == "string" )这块
首先来看看我们已经分析了那些还剩下那些情况:
1.if ( selector.nodeType ) 处理了dom对象
2.if (jQuery.isFunction(selector)) 处理预加载函数这一块
3.this.setArray(jQuery.makeArray(selector)) 处理了数组和伪数组情况
api中提供的方法,属于字符串的一块
1) 处理选择器,如 #id,.class,:input 之类的
2) 直接构建dom,$("<div><p>Hello</p></div>")
init方法上有两个参数selector, context其中context就是规定它的寻找范围,主要是处于性能上的考虑,假设已经了解dom的结构,可以加快锁定元素的速度,默认为document
var match = quickExpr.exec(selector);
if (match && (match[1] || !context)) {
if (match[1])
selector = jQuery.clean([match[1]], context);
else {
var elem = document.getElementById(match[3]);
if (elem) {
if (elem.id != match[3])
return jQuery().find(selector);
return jQuery(elem);
}
selector = [];
}
} else
return jQuery(context).find(selector);
quickExpr : "/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/"只关注两种情况,一种是直接针对构建dom的,一种是针对id选择器的,特别对id照顾是因为getElementById的速度是最快的,之所以会多出if (elem.id != match[3])这种情况是因为我们的ie老大哥在解析input这类的标签时在没有id有name的时候,会将name取代id,对于这种擅作主张的行为很不能接受,所要小心了。
jQuery.clean([match[1]], context) : 方法实现是创建一个临时的div,然后将
<(.|\s)+>添加到这个div的innerHTML上,会自动生成dom对象,然后解析这个对象,打包成数组返回。后面会详细说明
如果没有匹配结果或存在context的情况下,将执行jQuery(context).find(selector)方法通过选择器来寻找结果,这个选择器一块的知识后面会提到
分享到:
相关推荐
此外,"jquery.cookie.js"是另一个jQuery插件,用于处理浏览器的Cookie。它允许开发者方便地读取、写入和删除Cookie,从而实现用户数据的本地存储,这对于实现记住密码、页面状态保存等功能非常有用。 在实际应用中...
在jQuery的API中,`jQuery.extend`和`jQuery.fn.extend`是两个重要的方法,它们用于合并对象属性,但作用范围和用途有所不同。本文将深入探讨这两个方法的差异,并通过实例解析它们的工作原理。 首先,`jQuery....
jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)...
在jQuery库中,`jQuery.fn.init`是jQuery构造函数的核心部分,它用于初始化新的jQuery对象。当我们使用`$`符号或者`jQuery`函数创建一个新的jQuery实例时,实际上就是在调用`jQuery.fn.init`。这个函数接收三个参数...
**jQuery UI** 是一个强大的JavaScript库,用于构建用户界面,它基于流行的jQuery库。这个压缩包包含两个关键文件:`jquery-ui-1.8.16.custom.min.js` 和 `jquery-ui-1.8.16.custom.css`,这些都是jQuery UI的特定...
而 `jquery.hash.min.js` 和 `jquery.ba-hashchange.min.js` 这两个文件则是在 jQuery 基础上扩展了对浏览器 URL hash 变化的处理,从而实现单页面应用(Single Page Application, SPA)中后退和前进按钮的刷新功能...
<script src="./public/js/jquery.datepicker-zh-CN.js"></script> <link href="./public/css/jqueryui/jquery-ui-1.10.3.min.css" rel="stylesheet"> $( "#datepicker" ).datepicker({dateFormat:"yy-mm-dd",...
jquery-1.3.2-vsdoc.js jquery-1.8.3.min.js jquery-1.3.2.min.js jquery-1.4.1-vsdoc.js jquery-1.4.1.min.js jquery-1.4.2-vsdoc.js jquery-1.4.2.min.js jquery-1.4.3-vsdoc.js jquery-1.4.3.min.js ...
在旧版本的jQuery中,`jQuery.holdReady()`是一个控制文档准备就绪(DOM ready)事件触发时机的函数。通过设置`hold`参数为`true`,可以暂停文档准备好后执行的回调,直到调用`holdReady(false)`才继续执行。在3.2.1...
jquery-1.4.4.min.js jquery.ztree.exhide.min.js jquery.ztree.exedit.min.js jquery.ztree.excheck.min.js jquery.ztree.core.min.js jquery.ztree.all.min.js jquery-1.4.4.js jquery.ztree.exhide.js jquery....
jquery-3.3.1.slim.min.js
在我们讨论的文件 "jquery-ui-1.9.2.custom.min.js" 中,我们可以看到这是该库的一个特定版本——1.9.2的自定义最小化版本。这个文件的核心在于“定制”和“最小化”,这两个特点使得它在实际项目中更具灵活性和效率...
jquery-3.5.0.js jquery-3.5.0.min.js.zip
在最新版本中,包括了`jquery.fn.sortable.js`和其压缩版`jquery.fn.sortable.min.js`,以及可能的替代版本`jquery.sortable.js`和`jquery.sortable.min.js`。这个插件主要适用于需要用户交互式调整元素顺序的场景,...
jquery.json-2.3.min.js和jquery.json-2.3.js jQuery为开发插件提拱了两个方法,分别是:jQuery.extend(object); 为扩展jQuery类本身 jQuery.fn.extend(object);给jQuery对象添加方法。
jquery.mobile-1.4.5.min.js A Touch-Optimized Web Framework jQuery Mobile is a HTML5-based user interface system designed to make responsive web sites and apps that are accessible on all smartphone, ...
jquery-ui-1.10.3.min.js
jquery.easing.1.3.min.js 动画效果js
在压缩包中,我们有两个jQuery相关的文件——`jquery.min.js`和`jquery-1.11.0.min.js`。`jquery.min.js`可能是指较新的版本,而`jquery-1.11.0.min.js`是jQuery 1.11.0的压缩版本,它提供了基本的DOM操作和功能,如...
jQuery版本迁移辅助插件,如果您使用的低版本jQuery改为高版本后出现错误,可以试试这个插件。用来检测和恢复在jQuery1.9版本中已删除或已过时的API。jquery-migrate-1.2.1.js,jquery-migrate-1.2.1.min.js