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. vue中eventbus 多次触发的问题

    相比于react,vue是一个更上手很快的框架.所说简单易用,但在做Vue项目的过程中,就会发现,坑还是有的.组件之间传递数据是一个常见的需求,父子组件传递数据在官网有介绍,除了父子组件,一般地,任意 ...

  2. react和vue对比

    相同点 都支持服务器端渲染 都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范 数据驱动视图 都有支持native的方案,React的 ...

  3. 【转】虚拟化(五):vsphere高可用群集与容错

    vsphere高级功能需要vcenter server和共享存储的支持才能实现.vsphere的高级功能有 vmotion.storage vmotion.vsphere HA.vsphere DRS ...

  4. 复习MySQL④查询功能、连接方式、联合查询

    用select语句查询: select〈目标列组〉 from〈数据源〉 [where〈元组选择条件〉] [group by〈分列组〉[having 〈组选择条件〉]] [order by〈排序列1〉〈 ...

  5. Doxyfile中插入图片

    下面讲一下如何在doxyfile中插入图片 在查看别人写的文档的过程中,看到可以在doxyfile中插入图片,对此十分的好奇,所以拿出来研究一下 那么这是如何实现的? 根据代码,可以看到如下的注释 @ ...

  6. Selenium3+python 加载Firefox配置

    有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile_di ...

  7. Windows下Jupyter notebook 修改默认打开(工作、保存)文件夹(路径)

    今天晚上兴致一起突然想看看我写了那么多的ipynb文件都去哪了 首先查了一下,应该是都默认保存到    C:\Users\芩溪儿   路径下了 然后我就想,我是不是得改改啊,总在那跟别的文件夹在一起总 ...

  8. Idea里面的postfix

    感谢慕课网IntelliJ IDEA神器使用技巧 闪电侠讲师,感觉有些工具真的是听听别人讲的比自己琢磨快很多 https://www.imooc.com/learn/924 也可以这样找到postfi ...

  9. apache下部署showdoc

    1. 安装apache2服务器sudo apt-get install apache2 2. 安装php环境 sudo apt-get install php7.1 libapache2-mod-ph ...

  10. BeanUtils.copyProperties()错误使用,给自己挖了坑

    场景:需要对某个集合中的所有元素拷贝到另一个集合中,想着BeanUtils.copyProperties()可以深拷贝对象,误以为也可以拷贝集合,于是乎写下了如下代码 List<CostRule ...