• jQueryDOM操作模块(二)


    DOM模块

    1、优化框架结构

    • 目标:在实现功能基础上优化代码使得框架更简单易用

    1.1 简化存储DOM元素的容器 - elements

    • 目标:使用 this 作为容器

    1.1.1 使用 elements 的优缺点:

    • 优势:使得数据和方法分离,结构清晰明了
    • 劣势:增加了使用数据的复杂度

    1.1.2 jQuery中存储数据的容器

    • 思路:直接把数据存储到 this 中
    • 问题:如何jQuery对象转化为DOM对象?

    1.2 使用this作为存储数据的容器

    • 思路:直接使用this存储数据并提供 length 属性
    • 问题:如何获取数据的个数?
    • 修改:appendTo 去掉 elements
    var itcast = function(selector) {
        return new itcast.prototype.init();
    };
    
    itcast.prototype = {
        constructor: itcast,
        length: 0,
        init: function(selector) {
            if(typeof selector === "string") {
                if(selector.charAt(0) === "<") {
                    push.apply(this, parseHTML(selector));
                }
            }
        }
    };
    
    itcast.prototype.init.prototype = itcast.prototype;
    

    2、增强 appendTo 方法的功能

    • 目标:实现追加元素的功能并支持多种类型的参数
    • 问题:参数处理的逻辑放在哪?

    2.1 可能存在的参数类型

    • 参数:字符串 / DOM对象 / DOM数组 / itcast对象
    • 思路:保证参数被处理后获取到的是一个伪数组即可(不管参数的类型是什么)

    2.2 回顾 appendTo 方法的实现

    • 前提:假定参数为字符串(选择器或者html字符串)
    • 思路:将字符串转化为 DOM对象数组

    2.3 重新考虑 itcast 的参数

    • 存在的参数类型:
    1 "" / null / undefined
    2 DOM对象
    3 DOM数组
    4 itcast对象
    5 fn
    6 string => 已经完成
    7 无参数
    

    2.3.1 修改 itcast 函数参数

    • 思路:分别针对不同的参数类型,进行不同的处理
    init: function(selector) {
        if(!selector) return this;
    
        if(itcast.isString(selector)) {
            if(selector.charAt(0) === "<") {
                itcast.push.apply(this, parseHTML(selector));
            } else {
                itcast.push.apply(this, select(selector));
                this.selector = selector;
            }
        } else if(itcast.isDOM(selector)) {
            this[0] = selector;
            this.length = 1;
        } else if(itcast.isItcast(selector)) {
            return selector;
        } else if(itcast.isLikeArray(selector)) {
            itcast.push.apply(this, selector);
        }
    }
    

    3、实现 append 方法 和其他方法

    • 目标:使用现有框架扩展DOM操作方法

    3.1 append 方法实现

    • 思路:直接调用 appendTo 方法
    itcast.fn.extend({
        append: function(selector) {
            itcast(selector).appendTo(this);
        }
    });
    

    3.2 prependTo 方法实现

    • 思路:同 appendTo 方法

    3.2.2 实现 prependTo

    itcast.fn.extend({
        prependTo: function(selector) {
            var tar = itcast(selector),
                i, j,
                tarLen = tar.length,
                srcLen = this.length;
            for(i = 0; i < tarLen; i++) {
                for(j = 0; j < srcLen; j++) {
                    tar[i].insertBefore(
                        i === tarLen - 1?
                        this[j]:
                        this[j].cloneNode(true), tar[i].firstChild
                    );
                }
            }
        }
    });
    

    4、添加链式编程支持

    • 目标:实现链式调用简化操作

    4.1 回顾 jQuery 的链式编程

    • 问题:如何实现链式编程?
    • 注意:有些方法中返回的不是 this (appendTo方法)

    4.2 给 appendTo 添加链式

    itcast.fn.extend({
        appendTo: function(dom) {
            // ...
            arr.push(node);
            // ...
            return itcast(arr);
        }
    });
    

    4.3 创建实例方法 each

    • 目标:实现链式编程简化操作
    itcast.fn.extend({
        each: function(callback) {
            return itcast.each(this, callback);
        }
    });
    

    5、提供remove方法

    itcast.fn.extend({
        remove: function() {
            return this.each(function() {
                this.parentNode.removeChild(this);
            });
        }
    });
  • 相关阅读:
    设计模式——原型模式
    设计模式——复合模式
    设计模式——桥接模式
    建筑模式
    设计模式——单键模式
    工厂模式
    抽象工厂
    设计模式——适配器模式
    一个简单的文件上传功能控件(原创)
    算法题:用php生成excel列
  • 原文地址:https://www.cnblogs.com/lsy0403/p/5910841.html
Copyright © 2020-2023  润新知