JQuery对象操作支持链式法则源码分析

JQuery链式法则

  何为链式法则?先给出非链式写法的例子

//非链式写法
$("div").css("width", 45px);
$("div").css("height", 45px);

  再给出链式写法的例子

//链式写法
$("div").css("width", 45px).css("height", 45px);

  JQuery实现元素的定位与操作,如果每一次操作,必须先获取一次对象,则会出现页面多次定位相同的DOM,页面脚本定位DOM可能会非常频繁,导致操作耗费时间,页面响应比较慢。

JQuery如何实现链式法则?

  下面以css接口为例分析如何实现。

css接口实现

    css: function( name, value ) {
        return access( this, function( elem, name, value ) {
                。。。
        }, name, value, arguments.length > 1 );
    },    

  首先,css接口有两个入参,name 和 value, 分别对应需要改变的css属性名和属性值。

  其次,css接口实现,实际上是调用 access 函数, name和value会作为参数传递到 access函数中, access的返回值就是css接口的返回值。

   这个返回值就是我们今天分析的目标,现在我们期望此返回值为 调用css接口的JQuery对象。

  再次, access接口的第一个参数,this,就是调用css接口的 JQuery对象。

  最后, access接口的第二个参数,fn, 为在css接口中定义的回调函数, 此函数在access函数中被调动,并应用到 调用css接口的JQuery对象上。

access接口实现

  对于我们例子中设置单个css属性的情况, 在access中执行到的关键代码如下:

  首先,对于css设置单个属性值情况, 对应//set one value

  这个时候, chainable为真,即链式法则生效,

  然后, 将入参 fn 针对入参 elems 每个元素依次调用,

  最后,判断chainable为真, 则直接返回入参elems, 对应css接口调用者JQuery对象。

  

// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it‘s a function
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
     ....// Sets many values
    if ( jQuery.type( key ) === "object" ) {
        ......
    // Sets one value
    } else if ( value !== undefined ) {
        chainable = true;
        ......
        if ( fn ) {
            for ( ; i < length; i++ ) {
                fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
            }
        }
    }

    return chainable ?
        elems :

        // Gets
        bulk ?
            fn.call( elems ) :
            length ? fn( elems[0], key ) : emptyGet;
};

链式法则终止

  如果对对象设置某个属性后,需要再获取设置后的值是否正确, 则涉及到终止链式规则, 因为此链式终止的接口,将会返回一个字符串,即属性值。

//链式终止,获取宽度
$("div").css("width", 45px).css("width");

  对应access函数涉及代码:

  对于css(“width”)

  css调用传入参数 chainable为false

  css调用传入参数 key 为 width字符串,不为null, 即bulk为false

  推导出, access 返回语句为 return length ? fn( elems[0], key ) : emptyGet;

  同时, length为 css调用的JQuery对象的个数, 大于0的,

  则 access返回语句, 进一步推到为 return fn( elems[0], key )

  fn即为 css函数中,传入access函数的fn参数, 此函数只作用于调用JQuery对象集合中的第一个元素, key为width,value未定义, 即fn返回值为 jQuery.css( elem, name )

// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it‘s a function
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
    var i = 0,
        length = elems.length,
        bulk = key == null; // 获取width,bulk为false

        ......
    return chainable ?
        elems :

        // Gets
        bulk ?
            fn.call( elems ) :
            length ? fn( elems[0], key ) : emptyGet;
};

  css 接口分析(css(“width”))

  value未定义,

  access的入参fn, 返回值为JQuery.css(elem, name), 为属性值

  access的入参chainable 为false

    css: function( name, value ) {
        return access( this, function( elem, name, value ) { // value 为undefined
            。。。。return value !== undefined ?
                jQuery.style( elem, name, value ) :
                jQuery.css( elem, name ); // value 为undefined,获取属性的值,并返回
        }, name, value, arguments.length > 1 ); // arguments.length > 1 为假, 即chainable == false
    },
时间: 2024-10-10 08:33:35

JQuery对象操作支持链式法则源码分析的相关文章

jQuery扩展与插件--附源码分析

扩展与插件 1. 编写JQuery插件 <script> $.extend(object) //为JQuery 添加一个静态方法. $.fn.extend(object) //为JQuery实例添加一个方法. jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, max: function(a, b) { return a > b ? a : b; } }); console.log($.min(3,4));

jQuery 源码分析(十三) 数据操作模块 DOM属性 详解

jQuery的属性操作模块总共有4个部分,本篇说一下第2个部分:DOM属性部分,用于修改DOM元素的属性的(属性和特性是不一样的,一般将property翻译为属性,attribute翻译为特性) DOM属性的静态方法接口如下: prop(elem, name, value)    ;设置或读取DOM属性,有两种用法,如下 ·$.prop(elem,name,value)      ;传入第三个参数表示设置elem元素的name属性值为value ·$.prop(elem,name,)      

jQuery.extend() 源码分析

jQuery.extend() 方法 可以合并对象 深拷贝与浅拷贝 源码分析: 概述:  1. 首先定义变量 options:保存每次循环遍历的arguments[i] , name: 保存循环遍历对象的key值 src:保存目标对象target的属性 copy: 保存合并对象的属性 copyIsArray: 如果copy是数组,用copyIsArray保存 clone:如果目标对象是数组,用clone保存. target:目标对象 deep: boolean值,判断是否是深拷贝 2. 然后判断

jQuery源码分析系列(36) : Ajax - 类型转化器

什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的响应只有 responseText与responseXML 二种 所以现在我要定义dataType为jsonp,那么所得的最终数据是一个json的键值对,所以jQuery内部就会默认帮你完成这个转化工作 jQuery为了处理这种执行后数据的转化,就引入了类型转化器,如果没有指定类型就依据响应头Con

jQuery 2.1.4版本的源码分析

jquery中获取元素的源码分析 jQuery.each({// 获取当前元素的父级元素 parent: function(elem) { var parent = elem.parentNode;//nodeType为11的节点类型是DocumentFragment return parent && parent.nodeType !== 11 ? parent : null; },//获取所有的 父节点 这涉及到 dir 方法 parents: function(elem) { ret

jQuery1.9.1源码分析--数据缓存Data模块

阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(elem, name, data)源码分析 internalRemoveData方法源码分析 internalData方法的源码分析 jQuery.fn.extend({data: function( key, value ) {}})源码分析 jQuery.extend({removeData: function( elem, name ) {}})源码分

jQuery-1.9.1源码分析系列完毕目录整理

jQuery 1.9.1源码分析已经完毕.目录如下 jQuery-1.9.1源码分析系列(一)整体架构 jQuery-1.9.1源码分析系列(一)整体架构续 jQuery-1.9.1源码分析系列(二)jQuery选择器 jQuery-1.9.1源码分析系列(二)jQuery选择器续1 jQuery-1.9.1源码分析系列(二)jQuery选择器续2——筛选 jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析 jQuery-1.9.1源码分析系列(三) Sizzle选择

jQuery-1.9.1源码分析系列(一)整体架构续

这一节主要是jQuery中最基础的几个东东 2.    jQuery的几个基础属性和函数 a. jQuery.noConflict函数详解 在jQuery初始化的时候保存了外部的$和jQuery _jQuery = window.jQuery, _$ = window.$, noConflict函数 noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window

NHibernate源码分析

NHibernate源码分析之开篇: 计划和安排 只从使用NHibernate以来,请被其强大的功能和使用的简洁所吸引. 为了进一步研究NHibernate,决定分析其源代码,如有感兴趣者,欢迎一起研究. 这里列出了将要分析的部分: 1.        NHibernate配置和持久对象映射文件 2.        NHibernate架构分析(uml图) 3.        NHibernate源码分析之一: 配置信息 4.        NHibernate源码分析之一(续): 对象映射 5