jQuery源码分析-jQuery中的循环技巧

时间:2022-12-13 21:06:55
  1. 作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail.com
  2. 声明:本文为原创文章,如需转载,请注明来源并保留原文链接。
  3. 前记:本文收集了jQuery中出现的各种遍历技巧和场景
  1. // 简单的for-in(事件)
  2. for ( type in events ) {
  3. }
  1. // 缓存length属性,避免每次都去查找length属性,稍微提升遍历速度
  2. // 但是如果遍历HTMLCollection时,性能提升非常明显,因为每次访问HTMLCollection的属性,HTMLCollection都会内部匹配一次所有的节点
  3. for ( var j = 0, l = handlers.length; j < l; j++ ) {
  4. }
  1. // 不比较下标,直接判断元素是否为true(强制类型转换)
  2. var elem;
  3. for ( var i = 0; elems[i]; i++ ) {
  4. elem = elems[i];
  5. // ...
  6. }
  1. // 遍历动态数组(事件),不能缓存length属性,j++之前先执行j--,保证不会因为数组下标的错误导致某些数组元素遍历不到
  2. for ( j = 0; j < eventType.length; j++ ) {
  3. eventType.splice( j--, 1 );
  4. }
  5. for ( var i = 1; i < results.length; i++ ) {
  6. if ( results[i] === results[ i - 1 ] ) {
  7. results.splice( i--, 1 );
  8. }
  9. }
  1. // 迭代过程中尽可能减少遍历次数(事件),如果你能知道从哪里开始遍历的话,这里是pos
  2. for ( j = pos || 0; j < eventType.length; j++ ) {
  3. }
  1. //倒序遍历(事件),减少了几个字符:循环条件判断,合并i自减和i取值,倒序遍历会有浏览器优化,稍微提升遍历速度
  2. for ( var i = this.props.length, prop; i; ) {
  3. prop = this.props[ --i ];
  4. event[ prop ] = originalEvent[ prop ];
  5. }
  1. // 倒序遍历,中规中矩,倒序会有浏览器优化,稍微提升遍历速度
  2. for ( j = tbody.length - 1; j >= 0 ; --j ) {
  3. if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
  4. tbody[ j ].parentNode.removeChild( tbody[ j ] );
  5. }
  6. }
  1. //不判断下标,直接判断元素(选择器)
  2. for ( i = 0; checkSet[i] != null; i++ ) {
  3. if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
  4. results.push( set[i] );
  5. }
  6. }
  7. for ( ; array[i]; i++ ) {
  8. ret.push( array[i] );
  9. }
  1. // 不判断下标,取出元素然后判断元素(选择器)
  2. for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
  3. }
  1. // 遍历DOM子元素
  2. for ( node = parent.firstChild; node; node = node.nextSibling ) {
  3. if ( node.nodeType === 1 ) {
  4. node.nodeIndex = ++count;
  5. }
  6. }
  1. // 动态遍历DOM子元素(DOM遍历),dir参数表示元素的方向属性,如parentNode、nextSibling、previousSibling、lastChild和firstChild
  2. for ( ; cur; cur = cur[dir] ) {
  3. if ( cur.nodeType === 1 && ++num === result ) {
  4. break;
  5. }
  6. }
  1. // while检查下标i
  2. var i = promiseMethods.length;
  3. while( i-- ) {
  4. obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
  5. }
  1. // while检查元素
  2. while( (type = types[ i++ ]) ) {
  3. }
  1. // while遍历动态数组(AJAX),总是获取第一个元素,检查是否与特殊值相等,如果相等就从数组头部移除,直到遇到不相等的元素或数组为空
  2. while( dataTypes[ 0 ] === "*" ) {
  3. dataTypes.shift();
  4. if ( ct === undefined ) {
  5. ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
  6. }
  7. }
  1. // while遍历动态数组(异步队列),总是获取第一个元素,直到数组为空,或遇到值为undefined的元素
  2. while( callbacks[ 0 ] ) {
  3. callbacks.shift().apply( context, args );
  4. }
  1. // while反复调用RegExp.exec(AJAX),能够否反复调是exec比re.test、String.match更加强大的原因,每次调用都将lastIndex属性设置到紧接着匹配字符串的字符位置
  2. while( ( match = rheaders.exec( responseHeadersString ) ) ) {
  3. responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; // 将响应头以key-value的方式存在responseHeaders中
  4. }
 

jQuery源码分析-jQuery中的循环技巧的更多相关文章

  1. &lbrace;&lbrace;jQuery源码分析&rcub;&rcub;jQuery对象初始化的多种传参数形式

    jQuery对象初始化的传参方式包括:1.$(DOMElement)2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是最常 ...

  2. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery&period;fn,jQury&period;prototype,jQuery&period;fn&period;init&period;prototype的分析)

    在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...

  3. jQuery源码分析-each函数

    本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...

  4. jQuery 源码分析&lpar;十九&rpar; DOM遍历模块详解

    jQuery的DOM遍历模块对DOM模型的原生属性parentNode.childNodes.firstChild.lastChild.previousSibling.nextSibling进行了封装 ...

  5. jQuery 源码分析&lpar;十六&rpar; 事件系统模块 底层方法 详解

    jQuery事件系统并没有将事件监听函数直接绑定到DOM元素上,而是基于数据缓存模块来管理监听函数的,事件模块代码有点多,我把它分为了三个部分:分底层方法.实例方法和便捷方法.ready事件来讲,好理 ...

  6. &lbrack;转&rsqb; jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

  7. js菜鸟进阶-jQuery源码分析&lpar;1&rpar;-基本架构

    导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...

  8. jQuery源码分析系列&lpar;转载来源Aaron&period;&rpar;

    声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...

  9. jQuery 源码分析&lpar;十八&rpar; ready事件详解

    ready事件是当DOM文档树加载完成后执行一个函数(不包含图片,css等),因此它的触发要早于load事件.用法: $(document).ready(fun) ;fun是一个函数,这样当DOM树加 ...

随机推荐

  1. JavaScript的理解记录(6)

    ---接上篇: 四.CSS相关: 1.CSS不支持注释// 支持注释/* */ 2. 几种浏览器厂商前缀: Firefox : -moz-;    Chrome:-webkit- ;      IE: ...

  2. Foreign key &lpar;referential&rpar; constraints on DB2 LUW v105

    oreign key constraints (also known as referential constraints or referential integrity constraints) ...

  3. CIO谈:基于K2 BPM平台怎么做报销?

    即时!可视!可控!高效! 面对报销系统四大业务目标,有一个对策——用K2! 演讲人:沈明 大鹏天然气CIO 查看完章分享内容请关注K2官方微信

  4. Ubuntu系统中Sogou输入法面板问题解决方案

    好消息- Ubuntu Kylin团队与搜狗公司合作开发了“搜狗输入法 for Linux”版本,支持Ubuntu 12.04 和 Ubuntu 14.04操作系统,在Sougou官网就可以下载到,附 ...

  5. 在PowerDesigner中设计物理模型2——约束

    唯一约束 唯一约束与创建唯一索引基本上是一回事,因为在创建唯一约束的时候,系统会创建对应的一个唯一索引,通过唯一索引来实现约束.不过唯一约束更直观的表达了对应列的唯一性,使得对应索引的目的更加清晰,所 ...

  6. 【原创】FPGA开发手记(一) UART接口

    以下内容均以Xilinx的Nexys3作为开发板 1. UART简介 UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串 ...

  7. &lbrack;LeetCode&num;191&rsqb;Number of Bits

    Problem: Write a function that takes an unsigned integer and returns the number of ’1' bits it has ( ...

  8. O2O领域添新军,正品网加快布局的战略考量

    前不久.正品网採购虚拟运营商30万170号码的招标公告引发了业界的广泛关注.一方面,虚拟运营商正处于"徘徊不定"的十字路口.据业内知情人士透露,眼下12家虚拟运营商企业共放号在20 ...

  9. TCPDump:捕获并记录特定协议 &sol; 端口

    Q. 如何使用 Linux / UNIX 平台下的 TCPDump 工具捕获特定协议或端口比如 80 (http)?如何使用 TCPDump 将流记录下来,然后(根据记录)查找到问题所在?       ...

  10. vs2015 工具栏添加控件

    就是“添加”——“组件(N)”,然后把需要的代码写进去,但是工具栏里面却显示不出来. 结果是得重启系统才行,重启之后的确显示在工具栏显示出来了,但是拖到设计界面的时候还会出现“未能加载工具箱项xxx, ...