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);
});
}
});

jQueryDOM操作模块(二)的更多相关文章

  1. jQueryDOM操作模块

    DOM操作模块 1.复习选择器模块(选择器模块结束) 目的:学而时习之 复习和总结选择器模块 2.DOM的基本操作方法 目标:回顾DOM操作的基本方法 3.1 DOM操作 -创建节点 练习 1:创建1 ...

  2. ansible笔记(5):常用模块之文件操作(二)

    ansible笔记():常用模块之文件操作(二) 文件操作类模块 find模块 find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样. 此处我们介绍一些find模块的常用参数, ...

  3. jQuery 源码解析(二十七) 样式操作模块 坐标详解

    样式操作模块可用于管理DOM元素的样式.坐标和尺寸,本节讲解一下坐标这一块. 对于坐标来说,jQuery提供了一个offset方法用于获取第一个匹配元素的坐标或者设置所有匹配元素的坐标,还有offse ...

  4. jQuery 源码解析(二十六) 样式操作模块 样式详解

    样式操作模块可用于管理DOM元素的样式.坐标和尺寸,本节讲解一下样式相关,样式操作通过jQuery实例的css方法来实现,该方法有很多的执行方法,如下: css(obj)            ;参数 ...

  5. jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解

    本节说一下DOM操作模块里的包裹元素子模块,该模块可将当前匹配的元素替换指定的DOM元素,有如下方法: wrap(html)               ;在每个匹配元素的外层添加一层DOM元素   ...

  6. jQuery 源码解析(二十三) DOM操作模块 替换元素 详解

    本节说一下DOM操作模块里的替换元素模块,该模块可将当前匹配的元素替换指定的DOM元素,有两个方法,如下: replaceWith(value)     ;使用提供的新内容来替换匹配元素集合中的每个元 ...

  7. jQuery 源码解析(二十二) DOM操作模块 复制元素 详解

    本节说一下DOM操作模块里的复制元素子模块,该模块可以复制一个DOM节点,并且可选择的设置是否复制其数据缓存对象(包含事件信息)和是否深度复制(子孙节点等),API如下: $.clone(elem, ...

  8. jQuery 源码分析(二十一) DOM操作模块 删除元素 详解

    本节说一下DOM操作模块里的删除元素模块,该模块用于删除DOM里的某个节点,也可以理解为将该节点从DOM树中卸载掉,如果该节点有绑定事件,我们可以选择保留或删除这些事件,删除元素的接口有如下三个: e ...

  9. jQuery 源码分析(二十) DOM操作模块 插入元素 详解

    jQuery的DOM操作模块封装了DOM模型的insertBefore().appendChild().removeChild().cloneNode().replaceChild()等原生方法.分为 ...

随机推荐

  1. Spring AOP --JDK动态代理方式

    我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinit ...

  2. SYN 和 RTO

    转自:https://huoding.com/2017/08/13/628 前两天,我在微博上推荐了一篇朝花夕拾的文章:The story of one latency spike,文章中介绍了 cl ...

  3. swift-正则验证手机号码

    // 手机号验证正则表达式 func validateMobile(phoneNum:String)-> Bool { // 手机号以 13 14 15 18 开头 八个 \d 数字字符 let ...

  4. 配置Jupyter

    前几天见同学有用Jupyter notebook的,有点喜欢,于是今天自己配了一下. Jupyter是一个非常好用编辑器,因为Jupyter notebook 不仅可以编写代码运行,并且可以直接在代码 ...

  5. 48.Query DSL

    主要知识点 1.Query DSL的理解及基本语法 2.如何组合多个搜索条件 bool     一.Query DSL的理解 Query DSL的查询形式如下: GET /_search { &quo ...

  6. 3..jquery的ajax获取form表单数据

    jq是对dom进行的再次封装.是一个js库,极大简化了js使用 jquery库在js文件中,包含了所有jquery函数,引用:<script src="jquery-1.11.1.mi ...

  7. MYSQL(一) 简单语法

    MYSQL(一) 简单语法 1.默认约束:mysql里面DEFAULT关键字后面是不用加括号的 --1.1 创建数据库 mysql> create database holly; Query O ...

  8. ik分词器各版本下载地址

    ik分词器各个版本下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases

  9. 【codeforces 798C】Mike and gcd problem

    [题目链接]:http://codeforces.com/contest/798/problem/C [题意] 给你n个数字; 要求你进行若干次操作; 每次操作对第i和第i+1个位置的数字进行; 将 ...

  10. 执行计划中Using filesort,Using temporary相关语句的优化解决

    昨天听开发人员提到,相关的彩票网页当中一个页面刷新的很慢,特别是在提取数据的时候,今天早上一到,便去找开发人员要去相关的也没进行浏览,窥探哪些数据出现了问题,开发人员使用PHP开发,所以我用IE很容易 ...