《JavaScript高级程序设计 第三版》学习笔记 (十)DOM详解

一、节点

1.节点层次

(1)节点是浏览器中的基础类型,所有DOM对象都是特殊的节点,继承自node,可以使用节点自带的方法。
(2)可以通过somenode.childNodes[0];somenode.childNodes.item(0);somenode.firstChild;somenode.lastChild迭代当前节点的子节点。
(3)可以通过somenode.parentNode获取当前节点的父节点。
(4)可以通过somenode.appendChild(anothernode);somenode.insertBefore(anothernode,somenode.firstChild);somenode.replaceChild(another,somenode.firstChild)添加和替换子节点。
(5)可以通过somenode.removeChild(somenode.firstChild)删除节点。

2.document类型

(1)document是一个特殊的node,是window的一个属性,可以在全局直接访问。
(2)可以通过document.documentElement;document.childNodes[0];document.firstChild获取html元素的引用,第一种效率最高。
(3)可以通过document.body获取body元素引用,这个最常用。
(4)可以通过document.title获取和设置页面的标题,这个设置不影响<title>标签。
(5)可以通过document.domain设置当前页面所在的域。当页面中存在多个frame/iframe,并且这些框架中的页面在不同域时,通过js是无法直接完成跨域页面通信的。如果把每个页面的document.domain设置成相同的值,这些页面就能相互访问对方包含的javascript对象了。
(6)可以通过document.getElementById;documment.getElementsByTagName;document.getElementsByName获取到html元素的引用。非常常用。
(7)可以通过document.anchors;document.applets;document.forms;document.images;document.links等特殊集合直接访问html元素。
(8)可以通过document.write;document.writeln动态写入文档流。

3.element类型

(1)直接把element理解为html元素也没有问题。因为element广泛的应用,就是提供了一组操作html标签的API。
(2)可以通过element.arrtName获取或设置html元素的某个属性值。如div.id=1;img.src="1.jpg";table.className="class1"。
(3)可以通过element.getAttribute("attrName");element.setAttribute("attrName",value);element.removeAttribute("attrName")设置、修改或删除html元素的属性。getAttribute返回的是某个属性的值,如果用这个方法去访问style或者onclick之类的属性,得到的都是字符串,而不是对象或函数。
(4)可以通过document.createElement("div"/"<div id='mydiv'>");的形式创建element。

二、DOM操作

1.动态脚本

(1)动态脚本指的是不在head写script标签载入js文件,而是通过创建element并添加的方法把外部js引入。
(2)引入动态脚本的难点在于,怎样确定脚本已经加载完毕可以使用了。我们将在以后的内容详细展开,这里只给出一个简单的例子。
[javascript] view plain copy
  1. //小实验  
  2. var script=document.createElement("script");  
  3. script.type="text/javascript";  
  4. script.src="demo.js";  
  5. document.body.appendChild(script);  

2.动态样式

(1)动态脚本是引入js文件,那css文件能动态加载么?答案是肯定的。
(2)样式的载入本来就是异步的,因此动态载入样式有个好处就是不用太关心啥时候完成。
[javascript] view plain copy
  1. //小实验  
  2. var link=document.createElement("link");  
  3. link.rel="stylesheet";  
  4. link.type="text/css";  
  5. link.href="style.css";  
  6. document.getElementsByTagName("head")[0].appendChild(link);  

三、DOM扩展

1.选择器

  用原生的getElementById和getElementsByTagName选取往往比较麻烦,扩展性也不好。因此有很多js库写了自己的选择器。W3C制定了一个选择器标准,要求所有实现此类功能的js库,都完成一个或使用已经存在的选择器,选择器使用CSS筛选器语法,开发人员都会尽可能提高自己的选择器的性能,从而提高js库的执行效率。目前实现最好的是jQuery的sizzle引擎。

2.HTML5

(1)HTML5定义DOM的同时,为js提出了很多新的API。
(2)document.getElementsByClassName(),根据class内容筛选出html元素;
(3)element.classlist,定义了一套操作class的api,如element.classlist.add/remove/toggle/contains。
(4)document.activeElement,保存当前具有焦点的element。element.hasFocus(),返回当前元素时候含有焦点。
(5)document.readyStated,表示页面是loading还是complete,目前所有浏览器都支持。
(6)document.charset,获取或设置页面渲染的字符集。
(7)自定义数据属性集data-。自定义字符集的好处是不必利用getAttribute去获取某个自定义属性,而是直接通过element.dataset.myAttr操作。当然,这要求html标签中,属性的前缀是data-。
(8)scrollIntoView(),允许控制滚动条滚动,以显示某个元素。element.scrollIntoView()。传入true或NULL,让元素顶部与窗口顶部对齐;传入false,让元素尽可能多的显示在页面中,类似与垂直居中。

四、专业扩展

  浏览器厂商都根据自己的喜好在标准之外添加着一些扩展功能。基本上这些功能是不通用的,但以后说不定会成为标准。比如element.children,是IE为了去除页面空白字符弄出来的,如果没有空白字符,这个和childNodes是完全一样的。还有contains,判断一个节点是不是另一个节点的祖先(注意不止是父亲),if (parentNode.contains(childNode))。另外还有几个控制滚动条的方法,这里不再赘述。

五、DOM2和DOM3

1.以上都是DOM1,而DOM2和DOM3的目的在于扩展DOM API,以满足操作XML的所有需求,同时提供更好的错误处理及特性检测能力。DOM2没有在DOM1基础上引入新类型,只是增加了新方法和新属性;DOM3同样增强了已有类型,但也引入了一些新类型。
2.js修改样式style的功能是DOM2才加入的。同时DOM2又增加了操作styleSheet的API。
3.DOM2级定义了createRange()方法,定义一个选中的范围。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 深入理解DOM脚本编程  第1章 遵循最佳实践    1.1 不唐突和渐进增强    1.2 让JavaScript运行起来     1.2.1 把行为从结构中分离出来     1.2.2 不要版本检测     1.2.3 通过平稳退化保证可访问性     1.2.4 为重用命名空间而进行规划     1.2.5 通过可重用的对象把事情简化     1.2.6 一定要自己动手写代码    1.3 JavaScript语法中常见的陷阱     1.3.1 区分大小写     1.3.2 单引号与双引号      1.3.3 换行     1.3.4 可选的分号和花括号     1.3.5 重载(并非真正的重载)     1.3.6 匿名函数     1.3.7 作用域解析和闭包     1.3.8 迭代对象     1.3.9 函数的调用和引用(不带括号)    1.4 实例:WYSIWYGJavaScript翻转图    1.5 小结   第2章 创建可重用的对象    2.1 对象中包含什么     2.1.1 继承     2.1.2 理解对象成员     2.1.3 window对象中的一切     2.1.4 理解作用域和闭包是根本    2.2 创建你自己的对象     2.2.1 一变多:创建构造函数     2.2.2 添加静态方法     2.2.3 向原型中添加公有方法     2.2.4 公有、私有、特权和静态成员真那么重要吗     2.2.5 对象字面量    2.3 this是什么    2.4 try{}、catch{}和异常处理    2.5 实例:你自己的调试日志     2.5.1 为什么需要JavaScript日志对象     2.5.2 myLogger()对象    2.6 小结   第3章 DOM2核心和DOM2 HTML    3.1 DOM不是JavaScript,它是文档    3.2 DOM的级别     3.2.1 DOM 0 级     3.2.2 DOM 1 级     3.2.3 DOM 2 级     3.2.4 DOM 3 级     3.2.5 哪个级别适合你    3.3 创建示例文档     3.3.1 创建DOM文件     3.3.2 选择一个浏览器   3.4 DOM核心     3.4.1 继承在DOM中的重要性     3.4.2 核心Node对象     3.4.3 核心Element对象     3.4.4 核心Document对象     3.4.5 遍历和迭代DOM树    3.5 DOM HTML     3.5.1 DOM2 HTML 的HTMLDocument对象     3.5.2 DOM2 HTML 的HTMLElement对象    3.6 实例:将手工HTML代码转换为DOM代码     3.6.1 DOM生成工具的HTML文件     3.6.2 使用示例HTML片段进行测试     3.6.3 扩充ADS库     3.6.4 generateDOM对象的框架    3.7 小结   第4章 响应用户操作和事件    4.1 DOM2级事件    4.2 事件的类型     4.2.1 对象事件     4.2.2 鼠标移动事件     4.2.3 鼠标单击事件     4.2.4 键盘事件     4.2.5 表单相关的事件     4.2.6 针对W3C DOM的事件     4.2.7 自定义事件    4.3 控制事件流和注册事件侦听器     4.3.1 事件流     4.3.2 注册事件     4.3.3 在事件侦听器中访问事件对象     4.3.4 跨浏览器的事件属性和方法    4.4 小结   第5章 动态修改样式和层叠样式表    5.1 W3CDOM2样式规范     5.1.1 CSSStyleSheet对象     5.1.2 CSSStyleRule对象     5.1.3 CSSStyleDeclaration对象     5.1.4 支持的匮乏    5.2 当DOM 脚本遇到样式    5.3 把样式置于DOM脚本之外     5.3.1 style属性     5.3.2 基于className切换样式     5.3.3 切换样式表     5.3.4 修改CSS规则    5.4 访问计算样式    5.5 Microsoft的filter属性    5.6 实例:简单的渐变效果    5.7 小结   第6章 案例研究:图像裁剪和缩放工具    6.1 测试文件    6.2 imageEditor对象     6.2.1 调用imageEditor工具     6.2.2 imageEditor载入事件     6.2.3 创建编辑器标记和对象     6.2.4 向imageEditor对象添加事件侦听器     6.2.5 缩放图像     6.2.6 裁剪图像     6.2.7 未完成的图像编辑器    6.3 小结  第二部分 浏览器外部通信  第7章 向应用程序中加入Ajax    7.1 组合的技术     7.1.1 语义化XHTML和DOM     7.1.2 JavaScript和XMLHttpRequest对象     7.1.3 XML     7.1.4 一个可重用的对象     7.1.5 Ajax是正确的选择吗    7.2 为什么Ajax会破坏网站及如何解决     7.2.1 依赖JavaScript生成内容     7.2.2 通过script标签绕过跨站点限制     7.2.3 后退按钮和书签功能     7.2.4 完成请求的赛跑     7.2.5 增加资源占用     7.2.6 问题解决了吗    7.3 实例:Ajax增强的相册    7.4 小结   第8章 案例研究:实现带进度条的异步文件上传功能    8.1 信息载入时的小生命    8.2 起点    8.3 完成整合:上传进度指示器     8.3.1 addProgressBar()对象的结构     8.3.2 载入事件     8.3.3 addProgressBar()对象    8.4 小结  第三部分 部分高级脚本编程资源  第9章 通过库来提高生产力    9.1 选择合适的库    9.2 增强DOM操作能力     9.2.1 连缀语法     9.2.2 通过回调函数进行过滤     9.2.3 操纵DOM文档    9.3 处理事件     9.3.1 注册事件     9.3.2 自定义事件    9.4 访问和操纵样式    9.5 通信    9.6 小结   第10章 添加效果增强用户体验    10.1 自己动手实现效果     10.1.1 让我看到内容     10.1.2 提供反馈    10.2 几个视觉效果库简介    10.3 视觉盛宴     10.3.1 MOO式的CSS属性修改     10.3.2 通过Script.aculo.us实现视觉效果     10.3.3 通过Moo.fx实现逼真的运动效果     10.3.4 圆角效果     10.3.5 其他库    10.4 行为增强    10.5 小结   第11章 丰富的Mashup!运用API添加地图、搜索及更多功能    11.1 API密钥    11.2 客户端API:离不开JavaScript     11.2.1 地图中的Mashup应用     11.2.2 Ajax搜索请求     11.2.3 地图与搜索的Mashup应用    11.3 服务器端API:需要代理脚本     11.3.1 通过Basecamp构建集成的To-Do列表     11.3.2 通过Flickr取得个性头像    11.4 小结   第12章 案例研究:用DOM设计选择列表    12.1 经典的感觉    12.2 构建更好的选择列表    12.3 策略?我们不需要臭哄哄的策略     12.3.1 相关的文件     12.3.2 FauxSelect对象     12.3.3 开始创建人造select元素     12.3.4 查找select元素     12.3.5 构建DOM元素    12.4 添加事件——为人造select赋予生命    12.5 让表单绽放光彩    12.6 行为修正     12.6.1 z-index来救急     12.6.2 键盘控制及其他细节     12.6.3 select太大了吗    12.7 最后的细节    12.8 继续替换select的冒险    12.9 小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值