jquery1.0源码【1-60行】构造函数及全局$变量
一、jquery源码1-60行
该部分代码主要完成jquery对象的创建,以及全局变量$与jQurey类的映射;
/*
* jQuery - New Wave Javascript
*
* Copyright (c) 2006 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* $Date: 2006-10-27 23:14:48 -0400 (Fri, 27 Oct 2006) $
* $Rev: 509 $
*/ // Global undefined variable
window.undefined = window.undefined;
function jQuery(a,c) { // Shortcut for document ready (because $(document).each() is silly)
if ( a && a.constructor == Function && jQuery.fn.ready )
return jQuery(document).ready(a); // Make sure that a selection was provided
a = a || jQuery.context || document; // Watch for when a jQuery object is passed as the selector
if ( a.jquery )
return $( jQuery.merge( a, [] ) ); // Watch for when a jQuery object is passed at the context
if ( c && c.jquery )
return $( c ).find(a); // If the context is global, return a new object
if ( window == this )
return new jQuery(a,c); // Handle HTML strings
var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
if ( m ) a = jQuery.clean( [ m[1] ] ); // Watch for when an array is passed in
this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
// Assume that it is an array of DOM Elements
jQuery.merge( a, [] ) : // Find the matching elements and save them for later
jQuery.find( a, c ) ); // See if an extra function was provided
var fn = arguments[ arguments.length - 1 ]; // If so, execute it in context
if ( fn && fn.constructor == Function )
this.each(fn);
} // Map over the $ in case of overwrite
if ( $ )
jQuery._$ = $; // Map the jQuery namespace to the '$' one
var $ = jQuery;
二、关于window.undefined
window.undefined = window.undefined;
这样写无论window有没定义undefined,window.undefined都能正确表示它的意思,在有些早期浏览器中window并没有定义undefined变量,所以jquery1.0中这样写;
三、关于ready函数
if ( a && a.constructor == Function && jQuery.fn.ready )
return jQuery(document).ready(a);
ready方法为jquery对象的原型方法,在源文件1093行中利用jquery的extend方法扩展的;
jquery中ready函数有两种写法:
1、直接调用原型方法ready
$(document).ready(function(){ /* do something */ })
2、直接往jQuery方法传入function对象
$(function(){ /* do something */ })
三、a = a || jQuery.context || document;
确保选中一个对象,如果a和jQuery.context都没定义,则会返回一个封装了document的jquery对象,如下:
var $obj = $(); //$obj等同于$(document)
四、jquery对象作为参数传入
if ( a.jquery )
return $( jQuery.merge( a, [] ) );
注意每个jquery对象都有jquery属性,值为它的版本号,因此可用此属性判断对象是否是jquery对象;
如果是jquery对象,则返回一份它的拷贝,注意jquery对象里面的DOM对象指的还是同一个引用,其它属性有各自的空间,具体可看merge和get方法内部实现,后续会讨论到;
例:
var objTmp = $("<p>23</p>");
var objTmp2 = $(objTmp);
objTmp2.jquery = 'ss';
var test1 = objTmp.jquery; //test1="$Rev: 509 $"
var test2 = objTmp2.jquery; //test2="ss"
var objTmp = $("123<p>23</p>sds");
var objTmp2 = $(objTmp);
objTmp2.html("hello");
var test1 = objTmp.html(); //test1 = "hello"
var test2 = objTmp2.html(); //test2 = "hello"
五、返回某jquery对象context下的jquery对象
if ( c && c.jquery )
return $( c ).find(a);
例:
var objTmp4 = $(".testDIv", $obj); //返回$obj节点下所有clss为testDIv的jquery对象
六、new jQuery
if ( window == this )
return new jQuery(a,c);
如果context是全局的,则new一个jquery对象并返回;
例如:$("#id");
该情况context是全局的,第一次运行到该语句,条件成立(window==this),因为js代码都是在window作用于下运行的,第二次运行到该语句的时候,jquery对象已经new出来了,此时this为new出来的对象,条件不成立(window!=this),跳过;
七、匹配处理html字符串
var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
if ( m ) a = jQuery.clean( [ m[1] ] );
注意第一句, 该正则表达式^[^<]*(<.+>)[^>]*$,
[^<] * //匹配n个非<字符, (<.+>) // 匹配<除“\r\n”之外的任何单个字符> [^>]* //匹配n个非>字符,
第二句,当匹配成功时,调用clean函数处理,参数为尖括号里面的字符串,clean函数通过document.createElement("div")创建一个临时div对象,然后将参数赋给innerHTML,最后将临时div的childNodes压入数组返回给a;
八、为jquery对象里的Dom对象、length赋值
this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
jQuery.merge( a, [] ) : jQuery.find( a, c ) );
往get函数传入数组或者类数组对象,get方法通过该数组参数生成Dom对象和length值,关于这部分的get源码如下
this.length = 0;
[].push.apply( this, num );
return this;
简单的说,就是在jquery对象中push进数组中的dom对象,由于jquery对象通过apply调用数组中的push方法,length也自动++;
push完成后,该jquery对象就拥有了length和一系列dom元素(如果有的话);
通过调用merge和find函数,会返回数组;
九、最后一个参数是函数的情况
var fn = arguments[ arguments.length - 1 ];
if ( fn && fn.constructor == Function )
this.each(fn);
如果最后一个参数是函数,则遍历执行;
十、全局变量$
if ( $ )
jQuery._$ = $;
var $ = jQuery;
如果已经定义$,则将$保存到 jQuery下,防止overwrite;
将jQuery namespace映射到$下,可少写5个字符;
jquery1.0源码【1-60行】构造函数及全局$变量的更多相关文章
- AFNetworking 3.0 源码解读(八)之 AFImageDownloader
AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...
- AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- spring boot 2.0 源码分析(一)
在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...
- spring boot 2.0 源码分析(二)
在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /** * Run the ...
- spring boot 2.0 源码分析(三)
通过上一章的源码分析,我们知道了spring boot里面的listeners到底是什么(META-INF/spring.factories定义的资源的实例),以及它是创建和启动的,今天我们继续深入分 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
随机推荐
- Microsoft Visual Studio 2013 VSTS单元测试指南
安装vs2013时并未安装VSTS工具包,所以在工具栏:工具->拓展和更新 进行下载安装 vs13已经用了两年了,相比于之前老师推荐的vc6.0感觉要强出很多,刚上手时感觉比较困难,在使用一 ...
- python关键字详解
今天依旧在啃:<笨方法学python>,其中习题37是复习各种关键字.我本想百度一下记一下就ok了,但是百度出来第一个就Hongten的博客.我才意识到我也有博客,我应该学习他,把这些积累 ...
- 1 Servlet开篇准备
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1. HTTP协议 HTTP协议是TCP/IP协议的上层协议.TCP负责确保从一个网络节点向另一个网络节点发送的 ...
- 利用 ELK系统分析Nginx日志并对数据进行可视化展示
一.写在前面 结合之前写的一篇文章:Centos7 之安装Logstash ELK stack 日志管理系统,上篇文章主要讲了监控软件的作用以及部署方法.而这篇文章介绍的是单独监控nginx 日志分析 ...
- 警惕SQL语句陷井
以下SQL段,大家认为结果是什么呢? DECLARE @A VARCHAR(50) SET @A='Zuowenjun.cn' SELECT TOP 1 @A=ISNULL(FIELDNAME,'DE ...
- vmware安装mac
1.笔记本安装mac10.6 2.用VMware8,需要在mac.vmx中添加以下语句 guestOS = "darwin10"ich7m.present="TRUE&q ...
- MSIL指令集
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile
[源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
[源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...
- python代码风格-PEP8
转载自http://www.douban.com/note/134971609/ Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下 ...