javascript DOM 编程艺术 札记1
一个重要观点
DOM 是指 文档对象模型,它对应浏览器实际认知的东西。html 文本本身和 html 加载到浏览器中显示的东西并不是完全一致的,后者就是 DOM 节点树,它是浏览器实际认知的东西。一个原因就是 js 等可以操作 DOM,带来的结果就是这个页面的内容和结构还可以变化,而从 html 文本本身是看不出来这种变化的。
一幅地图可以代表一个城市,而 DOM 就是浏览器中实际显示页面(对应城市)的地图。
DOM 定义
上边的是抽象思想,不是具体定义。DOM 实际上是一组 API,而 API 是指得到多方共同承认的一组约定。
DOM 就是一组与平台和语言无关的接口,程序和脚本通过这些接口可以访问和修改文档的内容、结构和样式。
DOM 中的节点
每个 html 标签、标签中的属性和文本都是节点,由这些节点构成的整体就是 DOM 节点树,也就是上面指代的浏览器实际认知的东西。节点有个属性 nodeType,可以区分不同节点。
- 元素节点,nodeType = 1
- 属性节点,nodeType = 2
- 文本节点,nodeType = 3
<h1 id="keypoint">核心概念</h1>
这里的<h1>就是元素节点,'id="keypoint"'为属性节点,"核心概念"为文本节点
获取元素的方法
- document.getElementById("keypoint");
- document.getElementsByTagName("h1");
- document.getElementsByClassName("sale");
这里就不介绍id和class对应的概念了吧,用过CSS和Jquery的应该都知道。
注意后两个返回的是对象数组!!!
获取和设置属性
- object.getAttribute("title");
- object.setAttribute("title", "value");
setAttribute这种对文档的修改查看源代码是看不出来的,这源于 DOM 的工作模式,先加载静态内容,再动态刷新。这里印证了上边提到过浏览器实际认知的东西。
onclick 事件处理函数
用户点击链接时触发的动作,对应一个事件处理函数,函数有返回值,如果返回的false,则会认为“没有被点击”。
<a href="http://ipush.tech" onclick="return false;">点击这里</a>
页面上点击这个的话则不会跳转,因为实际的函数返回的是false
整个 DOM 节点树和 childNodes 属性
上边零星介绍了几个方法和属性,这里系统整理下。
我们知道 javascript 中有三种对象,分别是
- 用户定义对象
- 内建对象,比如 Array、Math 和 Date 等。
- 宿主对象,由浏览器提供的对象。
最基础的对象是window对象,代表的是浏览器的窗体本身,我们的 DOM 节点树就是加载到 window 所代表的窗体内,而这个对应节点树的对象就是 document了。
我们知道有个函数是 window.onload,这也是个事件处理函数,它代表的是文档加载完毕时会立即触发的事件,所谓的加载完毕,就是指document对象已经存在了,要将它赋值给window对象作为它的一个属性的时候。在这时执行的事件算是第一时间对 DOM 进行处理的了,可以想象它用处之大(可以类比java中的构造器函数)。
做实验可知,document这个对象有两个子节点,一个是<!DOCTYPE>,另外一个就是整个<html>标签包裹的内容。
<script type="text/javascript">
function hello() {
for (var i = 0; i < document.childNodes.length; i++) {
console.info(i);
console.info(document.childNodes[i]);
}
}
window.onload = hello;
</script>
内容展示如图

childNodes可以获取到元素的所有子节点(不包括属性节点),nodeType可以知道节点的类型,而nodeValue则可以用来获取和设定一个节点的值。
但有一点需要注意,举例来说<h1 id="keypoint">核心概念</h1> 中,document.getElementById("keypoint")得到的是<h1>这个元素节点,并不是文本节点,我们要获取和设定的是其子节点,应该用 document.getElementById("keypoint").childNodes[0].nodeValue;
对于子节点,还有些便捷的属性可以用,比如 firstChild 和 lastChild。
javascript DOM 编程艺术 札记1的更多相关文章
- javascript DOM 编程艺术 札记2 平稳退化
定义 指的是即便浏览器不支持javascript,页面的基础展示功能也不会受到影响的做法. 不能平稳退化的实例 javascript:这种伪协议,它可以通过链接调用javascript函数.比如< ...
- 读书笔记:JavaScript DOM 编程艺术(第二版)
读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...
- JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析
先贴上moveElement()函数的大纲,为了方便观看,删了部分代码,完整版粘到文章后面. function moveElement(elementID,final_x,final_y,interv ...
- JavaScript DOM编程艺术学习笔记(一)
嗯,经过了一周的时间,今天终于将<JavaScript DOM编程艺术(第2版)>这本书看完了,感觉受益匪浅,我和作者及出版社等等都不认识,无意为他们做广告,不过本书确实值得一看,也值得推 ...
- JavaScript DOM编程艺术第一章:JavaScript简史
本系列的博客是由本人在阅读<JavaScript DOM编程艺术>一书过程中做的总结.前面的偏理论部分都是书中原话,觉得有必要记录下来,方便自己翻阅,也希望能为读到本博客的人提供一些帮助, ...
- 《JavaScript dom 编程艺术》 placeholder占位符IE8兼容办法。
在<JavaScript dom 编程艺术>第11章学来的. 相对于用JavaScript替换文本框的提示语句 <!DOCTYPE html> <html lang=&q ...
- 《javascript dom编程艺术》笔记(一)——优雅降级、向后兼容、多个函数绑定onload函数
刚刚开始自学前端,如果不对请指正:欢迎各位技术大牛指点. 开始学习<javascript dom编程艺术>,整理一下学习到的知识.今天刚刚看到第六章,记下get到的几个知识点. 优雅降级 ...
- 《JavaScript DOM 编程艺术》
前几天京东买了一本书,在豆瓣上好评如潮,买下了啃一啃,书名<JavaScript DOM 编程艺术>,在好好深造一下javaScript.一边啃,一边敲.当然应该要做好笔记.一些简单的就看 ...
- JavaScript DOM编程艺术读后感(1)—— 平稳退化
最近,在读<JavaScript DOM编程艺术(第二版)>这本书,想着将自己的读后感记录下来,作为记忆吧. 其实我并不是最近才刚开始读这本书的,我读了有一段时间了.我是一名web前端开发 ...
随机推荐
- C++ 求向量的交集、并集、差集
#include<iostream> #include<stdio.h> #include<list> #include<algorithm> //se ...
- javascript实现html中关键字查询
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Vue.js 第5章 webpack配置
为什么我们需要打包构建工具:因为我们以后做项目的时候,会使用到很多种不同的工具或者语言,这些工具或者语言其实浏览器并不支持 webpack 是一个现代 JavaScript 应用程序的模块打包器(mo ...
- linux 端口映射设置
iptables -t nat -A PREROUTING -p tcp --dport 新端口 -j REDIRECT --to-ports 旧端口
- OpenStack项目及组件功能简单介绍
核心项目3个 1.控制台 服务名:Dashboard 项目名:Horizon 功能:web方式管理云平台,建云主机,分配网络,配安全组,加云盘 2.计算 服务名:计算 项目名:Nova 功能:负责响应 ...
- vue-awesome-swiper轮播插件的使用方法及问题。
在使用vue-awesome-swiper的时候,遇到一些问题,记录一下! 1.npm 安装 npm install vue-awesome-swiper --save 2.使用 在mai ...
- macOS上搭建RabbitMQ+MQTT服务器
1. 下载RabbitMQhttps://www.rabbitmq.com/install-standalone-mac.html或通过brew直接安装RabbitMQ brew install ra ...
- codeforces2B.The least round way 题解 动态规划/模拟
题目出处:http://codeforces.com/problemset/problem/2/B 题目描述 给你一个 \(n \times n\) 的二维数组,它包含的元素都是非负整数.你需要寻找一 ...
- 接管SpringBoot对Activiti的数据源自动配置
SpringBoot的自动配置真的让人又爱又恨,但还是爱更多一点. SpringBoot想要帮我们自动配置好一切,但是有时候配置的却并不是我们需要的,甚至有时候会默默的坑我们. 我的项目是一个多数据源 ...
- Java JDBC学习实战(二): 管理结果集
在我的上一篇博客<Java JDBC学习实战(一): JDBC的基本操作>中,简要介绍了jdbc开发的基本流程,并详细介绍了Statement和PreparedStatement的使用:利 ...