摘要:
最近在啃jQuery1.11源码,上来就遇到Sizzle这个jQuery的大核心,虽然已经清楚了Sizzle的用途,先绕过去也没事,但明知山有虎偏向虎山行才是我们要做的。本文面向的阅读对象:正在学习Sizzle源码或有一定前端基础的同学们,可以一边看源码一边看这些文章进行验证,所以虽然我会分析源码中的正则表达式,有大量的注释,但不会讲正则表达式的基本用法!(我会给出一些链接,但不一定全面,请锻炼自主搜索的能力;为了避免歧义,本文的一些词会采用源码中的英文或js中的属性名)Sizzle部分的代码已经啃完,本系列还有后续,这几天将会一一放出。本文主要分为两个部分:什么是Sizzle、Sizzle的 阅读全文
摘要:
前言:本文主要分为两个部分:减脂相关守则与食谱。减脂相关守则主要提供一些结论,以便读者可以根据自己的实际情况选择食物。对于推导过程等更多内容可以参阅斌卡的《硬派健身专栏》减脂相关守则:1,减脂和减重是不一样的。减重减去的不一定是脂肪,更多的是体内的水份,且受其他因素影响——大个便轻半斤,喝杯水又重回... 阅读全文
摘要:
Callbacks模块实质上就是一个回调函数队列(当然吹得很牛逼。。比如“提供了一种强大的方法来管理回调函数队列”),之所以介绍它是因为后面的Derferred模块基于它。Callbacks生成时接收四个设置:once(只触发一遍),memory(记录前一次的触发传入参数,disable时是否清空队列),unique(确保队列中同样的函数只有一个),stopOnFalse(当调用某一个回调函数返回false时则停止触发)例:jQuery.Callbacks('once memory')Callbacks模块还有几个API,add,remove,has,empty,disable 阅读全文
摘要:
这篇也没什么好说的,初始化jQuery对象的函数要处理多种情况,已经被寒冬吐槽烂了。关联节点获取函数主要基于两个工具函数dir和sibling,前者基于指定的方向遍历,后者则遍历兄弟节点(真的不能合并?)。后面的一些API则主要调用这两个函数。大几百行代码,不过逻辑很简单// Initialize a jQuery object// A central reference to the root jQuery(document)var rootjQuery, // Use the correct document accordingly with window argument (sandbo 阅读全文
摘要:
之所以把这部分放在这里,是因为这里用到了一些基本API,前一篇介绍过后才能使用。//jQuery通过find方法调用Sizzle引擎//jQuery通过find方法调用Sizzle引擎jQuery.find = Sizzle;jQuery.expr = Sizzle.selectors;jQuery.expr[":"] = jQuery.expr.pseudos;jQuery.unique = Sizzle.uniqueSort;jQuery.text = Sizzle.getText;jQuery.isXMLDoc = Sizzle.isXML;jQuery.contai 阅读全文
摘要:
这篇文章比较繁杂,主要就是把jQuery源码从上到下列出来,看我的注释就好了。jQuery源码对各种加载器做了处理。//阅读这个源码是请先了解一下概念,即时函数,工厂模式(function( global, factory ) { //这里之所以这样处理,是为了考虑CommonJS的环境,所以先检测是否有CommonJS的环境。 if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-lik 阅读全文
摘要:
(在看以下内容之前请先对原型链有一定的了解,比如:prototype是对象还是函数?)在看jQuery的其他源码之前,必须对jQuery的数据结构有一定的了解。jQuery的核心很简单,jQuery工厂函数和jQuery对象,其他的都是各个功能模块工具函数。jQuery工厂函数主要有两个作用,生成jQuery对象和充当其他工具函数的命名空间(总不能把那些函数命名成全局函数来污染了全局变量吧)。但jQuery工厂函数不是简简单单地直接new jQuery()来生成jQuery对象,而是采用如下的形式。jQuery = function( selector, context ) { // The. 阅读全文
摘要:
前两天发现知乎收藏夹中的答案正在不断减少。。看来需要保存一下了,但之前别人的方式是用chrome插件(浏览器无法自动保存本地文件)+wget前后端配合来完成这个工作的,而且还有一些缺点(比如保存的html无法更名),十分麻烦,所以打算用后端程序来抓一下网页,最终还是选择了Node来实现,是因为想借此机会学习一下Node。结果:好端端的异步编程被窝写成了同步编程。。这次就放同步编程的代码好了,下次再放异步的。。(而且发现在一个月前就有人用python和c#实现了一个足够好的版本。。一下就没动力了)废话少说,放代码。(Node的基本知识不用我说了吧)//自己用的小品代码,所以没有拆成多个模块,而是 阅读全文
摘要:
最近在啃jQuery的源码,估计会啃到很多浏览器兼容性的问题,所以整理一下1,IE下的内存泄露.在IE中不在DOM树中的独立节点有javascript变量引用它的时候不会被回收。解决:手动将该js变量置为null2,IE= 011,delete DOM元素上的自定义属性时,IE<9会报错,具体规则如... 阅读全文
摘要:
在上一章中,我们说到在之前的查找阶段我们已经获得了待选集seed,那么这一章我们就来讲如何将seed待选集过滤,以获得我们最终要用的元素。其实思路本质上还是不停地根据token过滤,但compile这个函数将这些matcher(filter生成的闭包过滤函数)给编译成一个函数(这个效率和我们直接使用过滤函数差不多,关键是在后面),再保存这一个函数,以后遇到同样的selector就可以不用再编译,直接调用就可以了。接下来我们看看compile的代码compile = Sizzle.compile = function( selector, group /* Internal Use Only * 阅读全文
摘要:
在用前两篇讲述完正则表达式、初始化、特性检测之后,终于到了我们的正餐——Sizzle工厂函数!Sizzle工厂函数有四个参数,selector:选择符context:查找上下文results:返回的结果数组seed:待选元素,刚开始是undefined,但有的情况下Sizzle会递归调用,故那个时候会将待选元素层层传递当我们要使用Sizzle时,使用频率最高的通常是直接指定单个id、class、tag来获取(通常还指定查找上下文来加速这一过程),而这种情况下Sizzle做了优化,当判断是这三种情况时,直接调用原生API来获取元素。其次,最快的方法莫过于使用querySelectorAll了,也 阅读全文