jQuery源码分析之jQuery中的循环技巧详解
作者:bea
jQuery的源码中有很多值得学习借鉴的技巧,本文即收集了jQuery中出现的各种遍历技巧和场景。具体分析如下: // 简单的for-in(事件) for ( type in events ) { } // 缓存length属性,避免每次都去查找length属性,稍微提升遍历速度 // 但是如果遍历HTMLCollection时,性能提升非常明显,因为每次访问HTMLCollection的属性,HTMLCollection都会内部匹配一次所有的节点 for ( var
jQuery的源码中有很多值得学习借鉴的技巧,本文即收集了jQuery中出现的各种遍历技巧和场景。具体分析如下:
// 简单的for-in(事件)
for ( type in events ) {
}
// 缓存length属性,避免每次都去查找length属性,稍微提升遍历速度
// 但是如果遍历HTMLCollection时,性能提升非常明显,因为每次访问HTMLCollection的属性,HTMLCollection都会内部匹配一次所有的节点
for ( var j = 0, l = handlers.length; j < l; j++ ) {
}
// 不比较下标,直接判断元素是否为true(强制类型转换)
var elem;
for ( var i = 0; elems[i]; i++ ) {
elem = elems[i];
// ...
}
// 遍历动态数组(事件),不能缓存length属性,j++之前先执行j--,保证不会因为数组下标的错误导致某些数组元素遍历不到
for ( j = 0; j < eventType.length; j++ ) {
eventType.splice( j--, 1 );
}
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[ i - 1 ] ) {
results.splice( i--, 1 );
}
}
// 迭代过程中尽可能减少遍历次数(事件),如果你能知道从哪里开始遍历的话,这里是pos
for ( j = pos || 0; j < eventType.length; j++ ) {
}
//倒序遍历(事件),减少了几个字符:循环条件判断,合并i自减和i取值,倒序遍历会有浏览器优化,稍微提升遍历速度
for ( var i = this.props.length, prop; i; ) {
prop = this.props[ --i ];
event[ prop ] = originalEvent[ prop ];
}
// 倒序遍历,中规中矩,倒序会有浏览器优化,稍微提升遍历速度
for ( j = tbody.length - 1; j >= 0 ; --j ) {
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
tbody[ j ].parentNode.removeChild( tbody[ j ] );
}
}
//不判断下标,直接判断元素(选择器)
for ( i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
results.push( set[i] );
}
}
for ( ; array[i]; i++ ) {
ret.push( array[i] );
}
// 不判断下标,取出元素然后判断元素(选择器)
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
}
// 遍历DOM子元素
for ( node = parent.firstChild; node; node = node.nextSibling ) {
if ( node.nodeType === 1 ) {
node.nodeIndex = ++count;
}
}
// 动态遍历DOM子元素(DOM遍历),dir参数表示元素的方向属性,如parentNode、nextSibling、previousSibling、lastChild和firstChild
for ( ; cur; cur = cur[dir] ) {
if ( cur.nodeType === 1 && ++num === result ) {
break;
}
}
// while检查下标i
var i = promiseMethods.length;
while( i-- ) {
obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
}
// while检查元素
while( (type = types[ i++ ]) ) {
}
// while遍历动态数组(AJAX),总是获取第一个元素,检查是否与特殊值相等,如果相等就从数组头部移除,直到遇到不相等的元素或数组为空
while( dataTypes[ 0 ] === "*" ) {
dataTypes.shift();
if ( ct === undefined ) {
ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
}
}
// while遍历动态数组(异步队列),总是获取第一个元素,直到数组为空,或遇到值为undefined的元素
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
// while反复调用RegExp.exec(AJAX),能够否反复调是exec比re.test、String.match更加强大的原因,每次调用都将lastIndex属性设置到紧接着匹配字符串的字符位置
while( ( match = rheaders.exec( responseHeadersString ) ) ) {
responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; // 将响应头以key-value的方式存在responseHeaders中
}
希望本文所述对大家jQuery的WEB程序设计有所帮助。
猜你喜欢
您可能感兴趣的文章:
- JQuery拖动表头边框线调整表格列宽效果代码
- jQuery通过点击行来删除HTML表格行的实现示例
- javascipt:filter过滤介绍及使用
- 用javascript将数据导入Excel示例代码
- js使用for循环及if语句判断多个一样的name
- JQuery实现当鼠标停留在某区域3秒后自动执行
- 鼠标悬浮停留三秒后自动显示大图js代码
- 使用typeof方法判断undefined类型
- jquery取子节点及当前节点属性值的方法
- jQuery CSS()方法改变现有的CSS样式表
- jQuery 浮动导航菜单适合购物商品类型的网站
- JavaScript中判断原生函数检查function是否是原生代码
- 三种取消选中单选框radio的方法
- 使用JQuery库提供的扩展功能实现自定义方法
- JQuery 给元素绑定click事件多次执行的解决方法
- 一个实用的图片切换支持点击切换和自动轮播
- 用JavaScript实现用一个DIV来包装文本元素节点
- 点击button获取text内容并改变样式的js实现
- js 数组去重的四种实用方法