一个重要观点

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的更多相关文章

  1. javascript DOM 编程艺术 札记2 平稳退化

    定义 指的是即便浏览器不支持javascript,页面的基础展示功能也不会受到影响的做法. 不能平稳退化的实例 javascript:这种伪协议,它可以通过链接调用javascript函数.比如< ...

  2. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  3. JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析

    先贴上moveElement()函数的大纲,为了方便观看,删了部分代码,完整版粘到文章后面. function moveElement(elementID,final_x,final_y,interv ...

  4. JavaScript DOM编程艺术学习笔记(一)

    嗯,经过了一周的时间,今天终于将<JavaScript DOM编程艺术(第2版)>这本书看完了,感觉受益匪浅,我和作者及出版社等等都不认识,无意为他们做广告,不过本书确实值得一看,也值得推 ...

  5. JavaScript DOM编程艺术第一章:JavaScript简史

    本系列的博客是由本人在阅读<JavaScript DOM编程艺术>一书过程中做的总结.前面的偏理论部分都是书中原话,觉得有必要记录下来,方便自己翻阅,也希望能为读到本博客的人提供一些帮助, ...

  6. 《JavaScript dom 编程艺术》 placeholder占位符IE8兼容办法。

    在<JavaScript dom 编程艺术>第11章学来的. 相对于用JavaScript替换文本框的提示语句 <!DOCTYPE html> <html lang=&q ...

  7. 《javascript dom编程艺术》笔记(一)——优雅降级、向后兼容、多个函数绑定onload函数

    刚刚开始自学前端,如果不对请指正:欢迎各位技术大牛指点. 开始学习<javascript dom编程艺术>,整理一下学习到的知识.今天刚刚看到第六章,记下get到的几个知识点. 优雅降级 ...

  8. 《JavaScript DOM 编程艺术》

    前几天京东买了一本书,在豆瓣上好评如潮,买下了啃一啃,书名<JavaScript DOM 编程艺术>,在好好深造一下javaScript.一边啃,一边敲.当然应该要做好笔记.一些简单的就看 ...

  9. JavaScript DOM编程艺术读后感(1)—— 平稳退化

    最近,在读<JavaScript DOM编程艺术(第二版)>这本书,想着将自己的读后感记录下来,作为记忆吧. 其实我并不是最近才刚开始读这本书的,我读了有一段时间了.我是一名web前端开发 ...

随机推荐

  1. Java练习 SDUT-1132_斐波那契数列

    C/C++经典程序训练2---斐波那契数列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写计算斐波那契(Fibon ...

  2. 14.libgdx的一些坑记录(持续更新)

    1. internal的文件路径 无法用list获取目录下文件     2.动态打包散图无法放入资源管理器,只能在资源加载器打包后的散图再合成打包,但都不如提前打包 3.资源加载器读入以texture ...

  3. 《C语言深度解剖》学习笔记之函数

    第6章 函数 1.编码风格 [规则6-1]每一个函数都必须有注释 [规则6-2]每个函数定义之后以及每个文件结束之后都要加若干个空行 [规则6-3]在一个函数体内,变量定义与函数语句之间要加空行 [规 ...

  4. Pytorch的网络结构可视化(tensorboardX)(详细)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xiaoxifei/article/det ...

  5. HZOJ 题

    首先对于n<=100的点,直接暴力dp,f[i][j][k]表示时间为i,在i,j位置的方案数,枚举转移即可,期望得分40. ) { ) { f[][][]=; ;i<=n;i++) ;x ...

  6. iptables SNAT与伪装

    Source NAT(SNAT)的主要應用,是让同一內部網路上的多部主机,可共用同一条Internet实体连線.直接与Internet相连的闸道器,可使用SNAT(搭配连線追蹤)来来改写內部网络与In ...

  7. Android中使用lambda表达式

    lambda 语法简介 视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 如果刚学Android,不知道怎么写点击事件可以跳转,传送门 要想在Android中使用lambda语法 ...

  8. SuperSocket性能数据采集的应用程序接口的改动

    性能数据采集的应用程序接口作了修改,两个虚方法已经被更改: protected virtual void UpdateServerSummary(ServerSummary serverSummary ...

  9. [C#] 如何把void*转换为byte[]

    一般来说,C#库的对外接口应该提供byte[]这样比较容易用的接口,而不应该提供裸的void* 但是有些库确实是这么封装的.那么就有一个如何转换的问题.MSDN推荐的转换方式是使用UnmanagedM ...

  10. 创建JAVASCRIPT对象3种方法

    创建JAVASCRIPT对象3种方法 方法一:直接定义并创建对象实例 var obj = new Object();    //创建对象实例 //添加属性obj.num = 5;   //添加属性 o ...