“声讨”高云的《jQuery技术内幕》
1. 前言:
其实本文有点太标题党了,哈哈,见谅。说“声讨”,就是说说我作为一个《jQuery技术内幕》一个忠实读者,读本书的一些想法和建议。
2014年2月20日,我收到了《jQuery技术内幕》,密密麻麻600多页。到今天4月9日,我已经看了400多页(除却sizzle的一部分没看,因为那块实在是看不懂,就先略过)。
我买了书,当时花了大约80元,而且认认真真的看了一大半,后面的部分我还会继续看下去。也算是一个忠实的读者。
学习新知识,总是一个痛苦的过程,期间也是痛并快乐着。总结痛苦的原因,一方面解读jQuery源码确实是一个庞大的工程,另一方面,也觉得作者在写书的时候漏掉了许多。
书看了一半多,总是想着写点什么。想来想去,印象最深的,是觉得作者没有给读者一个“台阶”,而是直接拔高到了源码的层面,一行一行的解读、注释。详细解读源码并没有什么不好,但是在解读每行的源码之前,应该想说点什么,把读者带进去。
下面我说几个例子:
例1. jQuery('div')到底是个什么对象?
本书一上来就是构建jQuery对象,列出了N中构建jQuery对象的方式,有DOM元素、字符串、函数等等。但是读者看了好大一部分篇幅之后,都不知道这些构建的对象,到底是什么?这些代码的最终结果是什么?到底为谁服务?以及对Jquery对象进行各种操作的时候,由于不明白它的结构而产生迷惑。
恰巧,当时我在看这本书的同时,也正在看miaov.com的视频教程,教程里面的讲师就及早的提到了这一点。例如:
jQuery('div')返回的,其实是一个对象,加入页面中有3个div元素,那么这个对象就会创建“0”、“1”、“2”这三个属性,分别指向这三个DOM对象,length属性记录个数。这样就不会让我们误以为jQuery('div')是一个数组。

我当时问过许多人,jQuery('div')是个什么对象,他们都误以为是一个数组,后来我跟他们说jQuery('div')是一个object,不是数组。
(题外话:jQuery('div')既然是object,那么JSON.stringify(jQuery('div'))会出错,为什么?因为jQuery('div')里面的DOM元素存在着循环引用。)
有些人可能会说:那是你自己懒,你不会去chrome中跟踪以下吗? 如果非要那么严格要求读者,就继续看下一例子。
例2. 属性操作中,“修正对象”是什么?
记得当时看这一段的时候,我都懵了,从来没接触过“修正对象”这个概念,满篇提到的get,set到底是什么东西?
现在回头再看,这些问题确实迎刃而解,但是当时确实不知道,于是就凑合着往前看,终于看到最后才算明白了,修正对象就是为了解决浏览器兼容性,分离除了的处理浏览器“个性”需求的方法。
一般情况下的html/DOM属性操作,可能通过简单的赋值或者设置就可以完成,但是有一些是需要照顾浏览器个性的,例如浏览器不支持getAttribute()该怎么办,更多例子可参见jQuery.support。jQuery把这些特殊情况,分离出来,集中到一个叫做“修正对象”的对象中,通过设置set和get来操作。因此,在获取一个html/DOM属性时,jQuery会先检查是否符合修正对象里的情况,如果符合就调用get来返回值,如果不符合,就用最基本的操作返回值。
如果本书在该章节前面,加这样一段解释,以例子或者流程图的形式展示更好,先把修正对象、get、set、的意义大体说一遍,让读者心里有个谱,我想读起来会轻松许多。
例3. jQuery的事件存储结构是怎样的?
正是我现在看的章节,现在才算稍微明白一点。书中之前介绍过,事件存储在jQuery.cache中,不是直接用div1.onclick=function(){...}的方式。但是写到事件这一章节,没有再深入介绍,即直接上来代码解释了。看它代码中各种取值赋值,看的很难受,不知道从哪里取出,也不知道赋值到哪里去。
我觉得我现在像是个警察再查找一个案件的线索一样,探寻着代码中的蛛丝马迹,再加上自己看一些博客,才算稍微明白点事件的存储结构,待完全明白估计得把这一章看完,然后再重新梳理一遍才行。
elemData = $.data(div1); //div1对应的缓存
handle = elemData.handle; //主监听函数(统一触发、执行其他函数)
events = elemData.events; //elemData.events
handlers = events["click"]; //click 对应的监听对象数组
handlers.push(handleObj); //监听对象数组中存储了若干个监听对象
//handleObj又包含了事件类型、触发函数等等各类信息
另外,还有一个重要信息:事件既然被jQuery给重新规定了格式,那么“事件冒泡”肯定是没有了,怎么办呢? jQuery在事件执行的时候自己来模拟冒泡,这一点如果不明白,看代码也会遇到许多疑惑。
总结:
说了这么多,我想大家也应该明白我的意思了。
《技术内幕》是一本很不错的书,我也很佩服作者的功力,自己看着人家的书,理解都那么费劲,何况作者写书呢。
如果《技术内幕》能够出第二版,希望作者能采纳我的建议,多加一些解释性的东西,多加一些“台阶”。
“声讨”高云的《jQuery技术内幕》的更多相关文章
- 《jQuery技术内幕:深入解析jQuery架构设计与实现原理》
<jQuery技术内幕:深入解析jQuery架构设计与实现原理> 基本信息 作者: 高云 出版社:机械工业出版社 ISBN:9787111440826 上架时间:2014-1-10 出版日 ...
- 【jquery】 【jQuery技术内幕】阅读笔记 一
jQuery( object ) jquery在构造对象时,除了可以用十分好用的css选择器来查找DOM,还可以传入一个javascript对象来生成一个jquery对象. // JS var foo ...
- jQuery技术内幕电子版5
4. 转换HTML代码为DOM元素 先创建一个文档片段DocumentFragment,然后调用方法jQuery.clean(elems, context, frag-ment, scripts)将H ...
- jQuery技术内幕电子版4
参数selector是复杂HTML代码 则利用浏览器的innerHTML机制创建DOM元素 第157行:如果HTML代码满足缓存条件,则在使用转换后的DOM元素时,必须先复制一份再使用,否则可以直接使 ...
- jQuery技术内幕预览版.pdf3
jQuery.fn.init(selector,context,rootjQuery):构造函数 jQuery.fn.init() 负责解析参数 selector 和 context 的类型,并执行相 ...
- jQuery技术内幕预览版.pdf2
第二章 构造jQuery对象 jQuery对象是一个类数组对象,含有连续的整型属性.length属性和大量的jQuery方法,$()是jQuery()的缩写 构造函数jQuery() 如果调用构造函数 ...
- jQuery技术内幕预览版.pdf1
第一章 总体构架 jQuery模块可以分为3部分:入口模块.底层支持模块和功能模块 浏览器功能测试模块提供了针对不同浏览器功能和bug的测试结果,其它模块基于测试结果解决浏览器之间的兼容性问题 回调函 ...
- 《JQuery技术内幕》读书笔记——自调用匿名函数剖析
Javascript语言中的自调用匿名函数格式如下: (function(){ //do somethings })(); 它还有另外两种等价写法如下: //等价写法一 (function(){ // ...
- 跌跌撞撞的看完了《jquery技术内幕》
今年2月20日买的书,今天是5月26,三个月来,除了周末休息一天,如果没有特殊情况,我都会每晚花两个小时看这本书,以及查各种与jquery源码相关的资料.今天总算是跌跌撞撞的看完了,有点小激动,也有点 ...
随机推荐
- 笔记:IIFE 立即执行的函数表达式 +function ($) { }(window.jQuery);
在Bootstrap源码(具体请看<Bootstrap源码解析1>)和其他jQuery插件经常看到如下的写法: +function ($) { }(window.jQuery); 这种写法 ...
- (线段树 区间运算求点)Flowers -- hdu -- 4325
http://acm.hdu.edu.cn/showproblem.php?pid=4325 Flowers Time Limit: 4000/2000 MS (Java/Others) Mem ...
- Leetcode-448. Find All Numbers Disappeared in an Array(solve without extra space easy)
Given an array of integers where 1 ≤ a[i] ≤ n (n= size of array), some elements appear twice and oth ...
- 第84讲:Scala中List和ListBuffer设计实现思考
今天来学习了scala中的list和ListBuffer scala list 内部很多操作是listbuffer做的,因为改变元素,listbuffer非常高效,tl是var类型的 ,但是他属于s ...
- linux 下载文件
工作流程 1.tar pczvf file.tar.gz file 2.sz file.tar.gz:下载. 3.rm -i file.tar.gz: 删除.
- ubuntu 安装CUDA 8.0
安装CUDA 8.0 1) 在终端运行指令 sudo sh cuda_8.0.44_linux.run --no-opengl-libs 不加这个选项会进入循环登陆 2) 之后是一些提示信息,输入ac ...
- Python -bs4介绍
https://cuiqingcai.com/1319.html Python -BS4详细介绍Python 在处理html方面有很多的优势,一般情况下是要先学习正则表达式的.在应用过程中有很多模块是 ...
- 使用Squid部署代理服务
Squid是Linux系统中最为流行的一款高性能代理服务软件,通常用作Web网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存.简单来说,Squid服务程序会按照收到的用户请求向网站源 ...
- MySQL字符集的设置
Notice:文章基于ubuntu系统而写 1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式( ...
- Tomcat 启动成功后报 INFO [Timer-0] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access:
Tomcat 启动成功后报 INFO [Timer-0] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceL ...
