最开始只是想了解attr方法,发现它内部调用了jQuery.access()方法。除了attr,还有prop、text、html、css、data 都是内部调用了jQuery.access()方法,可见它的重要。
attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }
prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }
text: function( value ) { return jQuery.access( this, function( value ) { //code }, null, value, arguments.length ); }
html: function( value ) { return jQuery.access( this, function( value ) { //code }, null, value, arguments.length ); }
css: function( name, value ) { return jQuery.access( this, function( elem, name, value ) { //code }, name, value, arguments.length > 1 ); }
data: function( key, value ) { //code return jQuery.access( this, function( value ) { //code }, null, value, arguments.length > 1, null, true ); }
源码分析:
access: function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length,//jquery对象的长度 bulk = key == null;//false // Sets many values if ( jQuery.type( key ) === "object" ) {//键值对方式赋值 chainable = true;//链式 for ( i in key ) {//遍历递归调用自身 jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) {//单赋值 chainable = true;//链式 //这种情况也是赋值 如.attr( attributeName, function(index, attr) )传入的value就是一个函数 if ( !jQuery.isFunction( value ) ) {//如果第四个参数不是函数,raw为true raw = true; } if ( bulk ) {//key为null或者undefined时 // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value );//不知道这种情况什么时候出现 fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) {//如果第二个参数函数存在 for ( ; i < length; i++ ) {//对jquery数组中的每一个元素调用回调 //如果value不是函数 fn(elems[i], key,value); //如果value是函数:fn(elems[i], key,value.call( elems[i], i, fn( elems[i], key ))); fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } return chainable ? //如果是链式 elems : //返回jquery对象 // Gets 不是链式,是获取值 bulk ? //key为undefined或者null fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; //如果jquery对象有长度,获取对象第一个元素的键值,没长度,返回emptyGet }
目前的疑问:
1、什么情况下key的值为null和undefined
to be continue...
时间: 2024-10-10 10:18:00