当前位置: 首页 > news >正文

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个字符;

 

转载于:https://www.cnblogs.com/chenpi/p/5128225.html

相关文章:

  • Running Redis as a User Daemon on OSX With Launchd
  • webx5 复选框的显示
  • Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现 【转】
  • android makefile 小结
  • SqlServerException:拒绝对表对象的select,insert权限解决(新建账号导致的问题)
  • [知识点]C++中的运算符
  • 六间房 繁星 酷我 来疯 秀吧 新浪秀 直播播放器 Live 1.2
  • 组合条件测试
  • VCE文件的另类打开方式
  • 织梦DEDECMS {dede:field name='position'/}标签增加其它属性的
  • 各种链接
  • hdu 1316 How Many Fibs?
  • jboss7 添加虚拟目录 上传文件路径
  • OSChina 周六乱弹 —— 流氓软件是这样耍流氓的
  • 修改mysql用户密码
  • 「译」Node.js Streams 基础
  • 【面试系列】之二:关于js原型
  • 3.7、@ResponseBody 和 @RestController
  • git 常用命令
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Javascript基础之Array数组API
  • JAVA多线程机制解析-volatilesynchronized
  • RxJS: 简单入门
  • Spring Boot MyBatis配置多种数据库
  • 安卓应用性能调试和优化经验分享
  • 闭包--闭包作用之保存(一)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 码农张的Bug人生 - 见面之礼
  • 爬虫模拟登陆 SegmentFault
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端性能优化--懒加载和预加载
  • 小程序 setData 学问多
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 昨天1024程序员节,我故意写了个死循环~
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)学习JVM —— 垃圾回收机制
  • (力扣题库)跳跃游戏II(c++)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三)uboot源码分析
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)Linux+Windows下安装ffmpeg
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .CSS-hover 的解释
  • .mysql secret在哪_MySQL如何使用索引
  • .Net 6.0 处理跨域的方式
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 常见的偏门问题
  • .NET程序员迈向卓越的必由之路
  • .NET面试题(二)