博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jquery内核学习(5)--对象的遍历
阅读量:6855 次
发布时间:2019-06-26

本文共 2952 字,大约阅读时间需要 9 分钟。

现在来实现jquery插件中经典的几个方法.

对象的遍历

经典的用法:

$('div').each(function() {    //do something});

现在给我的jquery扩展一个each()方法:

jQuery.each = function(object, callback, args) {    for(var i in object)        callback.call(object[i], args);    return object;}

两个地方:

1.通过for循环遍历对象集合中的所有对象

2.为每个对象绑定相同的回调函数callback(),有个问题.就是对于不变的回调函数当不同的对象调用它的时候.只是this的指向不同!

callback.call(object[i], args);    //每次修改callback方法中this指向为object[i]

有了对象的遍历功能(虽然不健全,但还是有遍历的意思).接下就可以结合前面的选择器功能给对象绑定各种回调方法!

$().html的实现

想法很简单,遍历选择器选择的没一个节点对象,分别为他们调用js原生的innerHTML方法.

jQuery.fn = jQuery.prototype = {       init: function(selector, context) {        //......省略        },    html: function(val) {        jQuery.each(this, function(val) {            this.innerHTML = val;        }, val);    }}//很重要jQuery.fn.init.prototype = jQuery.fn;

简单的来个测试:

//test html
1
2
3
$('div').html('hello world!');

结果:

//result
hello world!
hello world!
hello world!

知识拓展

jQuery框架中封装的each()和html()方法远比上面YY的那个强大!附上源码. 

jQuery.extend ({    isFunction: function( obj ) {        //obj.toString()        return toString.call(obj) === "[object Function]";        //if obj is Object, toString.call(obj) = "[object Object]"    },    // args is for internal usage only    each: function( object, callback, args ) {        var name, i = 0,            length = object.length,            isObj = length === undefined || jQuery.isFunction(object);        //args is an array        if ( args ) {            if ( isObj ) {    //若object不是jquery对象                for ( name in object ) {                    //在每个对象上调用回调函数                    if ( callback.apply( object[ name ], args ) === false ) {                        break;                    }                }            } else {                    for ( ; i < length; ) {    //遍历对象数组                    if ( callback.apply( object[ i++ ], args ) === false ) {                        break;                    }                }            }        // A special, fast, case for the most common use of each        } else {            if ( isObj ) {                for ( name in object ) {                    if ( callback.call( object[ name ], name, object[ name ] ) === false ) {                        break;                    }                }            } else {                for ( var value = object[0];                    i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}            }        }        return object;    }})

$().html()方法的源码:

jQuery.fn = jQuery.prototype = {    html: function( value ) {              return value === undefined ?                  (this[0] ?                    this[0].innerHTML.replace(/ jQuery\d+="(?:\d+null)"/g, "")) :                    null) :                  this.empty().append( value );          }}

这么简洁,精炼的代码....好吧,下节继续实现extend()扩展方法.

转载于:https://www.cnblogs.com/Poised-flw/archive/2013/04/24/3039894.html

你可能感兴趣的文章
PHP类的定义
查看>>
Composer 中国镜像地址配置
查看>>
比特币暴跌后的连锁反应
查看>>
Python爬虫入门教程 62-100 30岁了,想找点文献提高自己,还被反爬了,Python搞起,反爬第2篇...
查看>>
第80节:Java中的MVC设计模式
查看>>
区块链100讲:以实例形式深入浅出讲透BANCOR算法
查看>>
Java并发编程 深入剖析volatile关键字
查看>>
Vue基础
查看>>
Flutter(一)之Flutter的的简单入门分析
查看>>
【Vue源码学习】Virtual Dom 原理解析
查看>>
js 中有哪些拷贝的方式
查看>>
k8s简单了解
查看>>
Quartz学习-通过binlog分析Quartz启动及集群的Failover
查看>>
当下流行的UI框架
查看>>
Python从零开始系列连载(21)——Python特色数据类型(元组)(下)
查看>>
[掘金专题] Google I/O 2017 已经结束,我们该如何评价?
查看>>
深入剖析Vue源码 - 选项合并(下)
查看>>
vue父、子、孙组件间数据传递、事件传递
查看>>
React 源码解析之总览
查看>>
Gulp
查看>>