翻了半天终于看到一个讲jQuery原理比较不错的了,具体详细内容可以看阮一峰的,写的也不错==

=======================================================================================

前言

对于JQuery,想必大家都很熟悉。目前,很多web项目,在实施的过程中,考虑到各浏览器原生JS API的兼容性,大都会选用JQuery或类似于JQuery这样的框架来进行网页效果开发。JQuery上手简单,也很容易学,即使是刚接触JQuery的开发人员,借助JQuery手册,也很快能在项目中使用开发。

虽然JQuery相对简单,但要全面掌握,且快速灵活的使用它也并不那么容易,它提供了很多方法,包含了网页开发的各个知识面,所以要全面掌握这些知识点,个人认为还是需要对jquery有深入的理解,对这些知识点做分类整理记忆,这样你才能面对一些JQuery代码的时候不会感到迷惑,才会知道采用何种方式实现某个特效是最佳实践,才能快速的采用JQuery来进行项目开发。

简单模拟JQuery

JQuery里的代码是出了名的刁钻,里面的奇技淫巧太多太多,如果你想通过源码来学习JQuery,没有一定的功底是很难做到的。所以下面写一个非常简单的库来模拟JQuery,方便大家理解。
总体代码

(function(window) {var doc = window.document;// -------------代码段二 ------------------var JQuery = function(selector) {return new JClass(selector);}// --------------- 代码段三 ----------------JQuery.html = function(obj) {if(obj && obj.nodeType === 1) {return obj.innerHTML;}}// ---------代码段一 --------------var JClass = function(selector) {if (selector.nodeType ) { // 如果传入的是DOM元素this.length = 1;}else if(selector.charAt(0) === '#') { //如果传入的是'#..'形式this.length = 1;this[0] = doc.getElementById(selector.slice(1));}else if(typeof selector === 'string') {//传入的是字符串,假设全部为html标签 ,如'div' 'p'等var nodes = doc.getElementsByTagName(selector);this.length = nodes.length;for(var i=0,len=nodes.length;i<len;i++) {this[i] = nodes[i];}}else { //都不是的话,就不识别咯this.length = 0;}};// ------------ 代码段四 --------------------JQuery.prototype.html = function() {if(this[0]) {return JQuery.html(this[0]);}}JClass.prototype = JQuery.prototype; // ------------ 代码段五 ---------------window.$ = window.JQuery = JQuery;}(window));

首先,先看代码段一,我们创建一个javascript引用类型,可以根据该引用类型以及输入的参数创建一个实例对象,输入的参数模拟JQuery选择参数,但没有JQuery强大,支持部分类型。

我们知道,可以通过new JClass(...)来构造一个实例对象,这没问题,但是JClass也是一个函数,可以被直接调用,而直接调用并不是我们想要的结果,为了防止JClass被开发人员直接调用,我们不能将JClass暴露给开发人员,那我们只能通过代码段二方式来构造JClass实例对象。

在代码段二,我们可以将JQuery暴露给开发人员,因为无论是通过new JQuery()还是JQuery(),返回的都是JClass实例对象,这是我们要的结果。

在网页开发过程中,为了代码的复用,我们常常会提供一些工具方法来方便开发,既然JQuery是完全暴露给开发人员使用的,我们完全可以将这些工具方法作为JQuery的静态属性。具体可参照代码段三,当然,我们还可以按照这种方式添加其它的工具方法 如text,val,attr,css ........

这些工具方法确实不错。JClass实例对象(封装了DOM)也存在一些公用的方法,正好这些方法也可以借助工具方法来实现,那怎么为JClass实例对象创建公用方法呢? 可以通过代码段四的方式实现(如果对这里不理解,请百度JS的原型继承概念) 。

最后可通过代码段五,将JQuery取个别名 $ 且作为全局变量暴露出来。然后将代码引入到HTML文件中进行测试,可参照下面代码:

<html>
<head><title>jquery-t2</title><script src="JQ.js"></script>
</head>
<body><div style="margin:10px 10px;"><span id='result'>点击看效果</span></div><div id='tst'>div文本值</div>
</body>
<script>alert($.html(document.getElementById('result '))); //点击看效果alert($('span').html()); //点击看效果alert($('#tst').html()); //div文本值
</script>
</html>

JQuery的知识点分类

通过上面模拟的JQuery库,我们应该可以大概知道JQuery的主要功能:通过强大的选择器获得DOM元素,然后针将这些DOM元素的日常操作封装成对应的方法,如取值、赋值、修改、删除等,同时JQuery还为网页开发提供了一些工具类方法,如eachajaxisArrayextend等。所以总的来说,JQuery知识点可分为三大类:

  • JQuery选择器

  • JQuery对象的操作,如DOM操作、表单操作等

  • JQuery的工具方法

  • JQuery插件编写(知识扩展)

JQuery太流行了,网上的资料太多太多,以致于很多初学者根本不知道从哪学起,这里看一篇博客,那里翻一翻源码,收集了大量的资料,最后发现根本没时间学习,即使花了大量的时间学习,学习到的JQuery也成不了一个体系,到最后全部忘记了。开发的时候又只能去翻手册,一直翻手册能写出好的代码么?不可能吧。

下面我分享一下个人认为比较好的资料供初学者一步一步学习。
JQuery入门(书籍+一篇博客)
锋利的JQuery(第二版) 
JQuery设计思想
JQuery深入学习(深入学习JQuery和javascript很好的资料)
JQuery源码分析系统

JQuery的一些概念

学习永远都不是记忆,记忆的东西迟早会被遗忘。真正要学习一门技术,最基本的原则就是要理解它。学习JQuery也是,在学习JQuery的知识点时,你首先要理解一些概念来辅助你理解这些知识点。 JQuery中的概念主要有这三个: JQuery()JQuery对象DOM对象

先说DOM对象,这个很简单,它定义了访问HTML文档对象的一套属性、方法和事件,没有JQuery前,我们通常直接操作DOM,比较熟悉的API有getElementById 、GetElementByTagName等。

JQuery,它在JQuery中有个别名 $ 。通过上面章节的模拟代码(对应模拟代码中的JQuery)可知,其实就是一个函数,说得更细致点就是JQuery对象的工厂方法,它可以根据不同的入参来构造JQuery对象,如:

  • 字符串表达式。如 $('span') 、$('span .class')、$('#id')

  • HTML 代码片段。如 $('<span>text</span>') 等

  • DOM元素。 如$(dom) //假设 var dom = document.getElementById('id');

  • JS Function 。 如 $(function(...) { ... } ); 一般对象或数组。如 { } 、[ ... ]

JQuery除了能创建JQuery对象的同时,JQuery自身也有很多静态方法,也可以称为工具方法,如 eachajaxtrim等。这些工具方法不仅在网页设计时常常会被用到,而且也会被当作工具方法用来实现JQuery对象的原型方法。

JQuery对象,非常重要的一个概念,类似于模拟代码中的JClass实例,通常是通过JQuery构造出的实例。在JQuery中,我们常常见到的JQuery对象是这样的: $('#id') 、$('div')等。关于JQuery对象我们要明白以下几点:

  1. JQuery对象继承了JQuery原型(prototype)的所有属性和方法

  2. JQuery对象不是数组,但是采用了类似数组的结构来存储元素,而且存储的元素是通过选择器获取得到的DOM对象。参照上面章节的模拟代码(JClass实例对象),JQuery对象有个length属性,表示当前对象里存储DOM对象的个数,而这些通过选择获得的DOM对象,是采用下标为0、1、2、3 ... 作为属性名来进行存储的。所以,根据以上特性,我们完全可以通过下面这种方式来访问元素:

var  objs = $('div');
for(var i=0,len=objs.length;i<length;i++) {var o = objs[i];  //获取dom元素... ...
}

综合来说,JQueryJQuery对象DOM对象三者之间的关系是: JQuery是个工厂方法,用来构造JQuery对象; JQuery对象是个类数组对象,里面存储了DOM对象

理解了三者之间的关系,我们在理解下面知识点时,相对来说也就比较容易了:

关于过滤选择器如何理解? 如$('div:first') 
如果理解了JQuery对象的内部结构,理解JQuery的过滤选择器就很容易了,如 :first 其实就是取JQuery对象属性为'0'的对象(封装成JQuery对象),同理 :last取的是属性为 length-1 的元素,:eq(index)取的是属性为index的元素。

在JQuery中,如何验证某个元素是否为空?

var $o = $('div  .class');
if($ == null) {  // 错误的做法//什么都没找到......}
//正确的做法
if($o.html() == null) {//什么都没找到... ...}
//正确的做法
if($o.length) {//什么都没找到
... ...} 

JQuery对象和DOM对象如何转换?

var dom = document.getElementById('id');
// DOM对象转换成JQuery对象
var $dom = $(dom);   // 参照JQuery对象的构造方式// 将JQuery对象转换成DOM对象
for(var i=0,len=$dom.length;i<length;i++) {var o = $dom[i];  //获取dom元素... ...
}

总结

关于JQuery,上手虽然简单,但如果要高效快速的使用开发,还是需要好好理解下JQuery的。以上只是个人学习过程中的一些感悟和整理,建议各位在学习时也按照自己的思维习惯形成一套自己的知识体系,一来便于日后的开发,二来也便于查阅别人的代码。最后附注一些有意思的小问题,各位有兴趣就思考下吧。

问题一. 你觉得下面哪种方式代码好一点?为什么?

  // 方式一
var $text = $("#text");
var $ts = $text.text();//方式二
var $text = $("#text");
var $ts = $.text($text);

问题二. 下面代码中的this是什么呢?大概实现原理有什么?

$('#box').click(function(){ var obj = this;... ...
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------

这里我自己也看了一下jquery的源码

起始部分是个匿名表达式函数,自动调用那种,参数传了windows和一个函数(如图1中所示为第二个参数);然后代码跑到自动调用的部分,其中自动调用传入的函数factory(),进行一系列初始化工作;

初始化过程大致瞄了一下,具体详细的还是要自己看,东西太多了,主要过程如下;

运行函数最后部分指出了$代替jQuery作为缩写;

JavaScript——JQuery原理介绍及模拟相关推荐

  1. jQuery 原理的模拟代码 -4 重要的扩展函数 extend

    在上两篇文章中,我们看到每次要通过 jQuery 的原型增加共享方法的时候,都需要通过 jQuery.fn 一个个进行扩展,非常麻烦,jQuery.fn.extend 提供了一个扩展机制,可以方便我们 ...

  2. 【JavaScript进阶学习】jQuery的介绍

    一.jQuery的介绍 框架:对原生语言或一些常见的操作进行修改后,形成自身的语法特色.并对一些常规操作,提供便携性的使用,或快速实现某种某类某个完整项目的实现 库:用来完善或补全当前项目或框架的某些 ...

  3. javascript动画系列第一篇——模拟拖拽

    前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容性问题,以及功能实现的方式,用的不是很广泛.javascript动画广泛使用的还是模拟 ...

  4. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...

  5. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧 1

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...

  6. HTML+CSS+JavaScript+JQuery

    文章目录 1. HTML 1. html 的介绍 1.1 html的定义 1.2 html的作用 1.3 小结 2. html 的基本结构 2.1 结构代码 2.2 浏览网页文件 3. 初始常用的 h ...

  7. 视频教程-javascript/jquery全过程详解-Java

    javascript/jquery全过程详解 资深大数据.java讲师,十年开发经验,曾经任职于北大青鸟.讯腾软件等多家知名教育机构,精通javaweb, 前端技术,J2EE技术体系,熟练使用Spri ...

  8. java语言的实现机制_JAVA语言之Java NIO的工作机制和实现原理介绍

    本文主要向大家介绍了JAVA语言之Java NIO的工作机制和实现原理介绍,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 前言 本文只简单介绍NIO的原理实现和基本工作流程 I/O和 ...

  9. php new对象 调用函数,关于JS中new调用函数的原理介绍

    这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...

最新文章

  1. 解决通过vue-router打开tab页,下次进入还是上次history缓存的界面状态的问题
  2. 分享matlab程序之——滤波器篇(高通,低通)
  3. 史上最大规模,天猫新零售如何爆改100家大润发?
  4. 单变量线性回归模型_了解如何为单变量模型选择效果最好的线性回归
  5. Linux环境_源码安装Unoconv实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件
  6. ie8浏览器自定义工具栏设置教程
  7. activate-power-mode,让你在Python编码中,感受炫酷的书写特效!
  8. 字符串拼接,什么时候会走StringBuilder?
  9. python颜色填充代码_求懂WORD的大佬怎么一次性填充颜色或者使用python识别
  10. phpstudy使用mysql8.0_windows系统-phpstudy升级mysql8.0.12安装教程及修改密码和安装注意事项...
  11. SQL Server基础知识
  12. 一次简单的PC游戏汉化
  13. 数据中心的“风火水电”
  14. 海外社交媒体平台如何选择
  15. Spring MVC 地址请求映射
  16. 蓝牙HC05模块,AT其他指令爆出ERROR[0] 解决方法
  17. 怎么利用计算机传输文件到邮箱,电脑和电脑怎么传文件_电脑和电脑之间如何传文件-win7之家...
  18. QT数据库访问技术简介
  19. 力扣 863. 二叉树中所有距离为 K 的结点
  20. 数字电子钟的设计与实现(纯数字电路,Proteus仿真)

热门文章

  1. python创建线程函数_Python多线程编程(三):threading.Thread类的重要函数和方法...
  2. iphone小圆点在哪儿设置_字节推大力教育新品牌;iPhone12跌破发行价;直播打赏将设置冷静期;蚂蚁A股网上申购开启 | Tech日报...
  3. centos7赋予全部权限_Centos7安装MySQL8.0
  4. 快速生成CSS样式语法(HTML、CSS)
  5. python的类中包含什么_Python中的类(中)
  6. Vue的mergeOptions函数分析-下
  7. 项目10.2-企业级自动化运维工具---puppet详解
  8. 浅谈前端响应式设计(二)
  9. Unity ToLua 中Update的调用流程
  10. eclipse代码编辑区字符串自动转义设置