近日在园子看了一篇文章,一位前端负责人问应聘者何为DOM事件流的三个阶段,我当时一看也是懵圈,于是强迫症复发,遂想要搞清楚它。谁知在查资料的过程中发现有好多关于DOM的概念也是模糊不清,便决定继续延伸,到最后发现辐射面实在太宽,适逢该版本项目已上线新需求未下得以有几日空闲,干脆一不做二不休从头搞起,在参考《JavaScript高级程序设计》的基础上,整理出这个系列。一来作为技术沉淀将来回顾方便;二来也希望能帮助到对这个点有困惑的园友,能力一般水平有限,不足之处还望诸位批评指正!

1.DOM是什么?  

用官方话说:(Document Object Model,简称DOM)文档对象模型,是针对XML但经过扩展用于HTML的标准编程接口。对于刚入门的小白来说这个解释可能太拗口。实际上就是在网页上,将页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型。它把整个页面映射为一个多层节点结构。HTML或者XML页面中的每个组成部分都是DOM中某种类型的节点。这些节点又包含着不同类型的数据。神马啊?还是不清楚?那好办下面通过一段代码和它对应的树形结构直观的感受一下。

<html >
<head>
<title>文档标题</title>
</head>
<body>
<a href="#">我的链接</a>
<h1>我的标题</h1>
</body>
</html>

  这样通过DOM创建的这个表示文档的树形图,开发人员就获得了控制页面内容和结构的主动权。借助DOM提供的API,开发人员就可以轻松自如的删除、添加、替换或修改任何节点。

2.为什么要使用DOM?

  话说当年在Internet Explorer 4和Netscape Navigator 4分别支持的不同形式的DHTML(Dynamic HTML)基础上,开发人员首次无需重新加载网页,就可以修改其外观和内容了。然而,DHTML在给Web技术发展带来巨大进步的同时,也带来了巨大的问题。由于Netscape和微软在开发DHTML方面各持己见,过去那个只编写一个HTML页面就能够在任何浏览器中运行的时代结束了。对开发人员而言,如果想继续保持Web跨平台的天性,就必须额外多做一些工作。而人们真正担心的是,如果不对Netscape和微软加以控制,Web开发领域就会出现技术上两强割据,浏览器互不兼容的局面。此时,负责制定Web通信标准的W3C(World Wide Web Consortium,万维网联盟)开始着手规划DOM。  

  但是得注意DOM并不只是针对JavaScript的,很多别的语言也都实现了DOM。不过,在Web浏览器中,基于ECMAScript实现的DOM的确已经成为JavaScript这门语言的一个重要组成部分。除了DOM核心和DOM HTML接口之外,另外几种语言还发布了只针对自己的DOM标准。下面列出的语言都是基于XML的,每种语言的DOM标准都添加了与特定语言相关的新方法和新接口:

  • SVG(Scalable Vector Graphic,可伸缩矢量图)1.0;
  • MathML(Mathematical Markup Language,数学标记语言)1.0;
  • SMIL(Synchronized Multimedia Integration Language,同步多媒体集成语言)。

  还有一些语言也开发了自己的DOM实现,例如Mozilla的XUL(XML User Interface Language,XML用户界面语言)。但是,只有上面列出的几种语言是W3C的推荐标准。

3. Web浏览器对DOM的支持

  在DOM标准出现了一段时间之后,Web浏览器才开始实现它。微软在IE5中首次尝试实现DOM,但直到IE5.5才算是真正支持DOM1级。在随后的IE6和IE7中,微软都没有引入新的DOM功能,而到了IE8才对以前DOM实现中的bug进行了修复。Netscape直到Netscape 6(Mozilla 0.6.0)才开始支持DOM。在Netscape 7之后,Mozilla把开发重心转向了Firefox浏览器。Firefox 3完全支持DOM1级,几乎完全支持DOM2级,甚至还支持DOM3级的一部分。(Mozilla开发团队的目标是构建与标准100%兼容的浏览器,而他们的努力也得到了回报。)  

  目前,支持DOM已经成为浏览器开发商的首要目标,主流浏览器每次发布新版本都会改进对DOM的支持。

JS基础DOM篇之一:何为DOM?的更多相关文章

  1. JS基础入门篇(三十五)—面向对象(二)

    如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)

  2. JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

       前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...

  3. JS基础入门篇(二十七)—BOM

    虽然上次写到js基础篇(二十四),这次直接写到(二十七).是为了提醒自己中间有几篇没写.特此说明一下啊. 1.window.open() 使用a标签呢,点击一下a标签页面才会跳转,有时候我们需要做的操 ...

  4. JS基础入门篇(二十四)—DOM(下)

    1.offsetLeft/offsetTop offsetLeft/offsetTop : 到定位父级节点的距离. <!DOCTYPE html> <html lang=" ...

  5. JS基础入门篇(二十四)—DOM(上)

    1.常用的节点类型,nodeType,attributes,childNodes. 1.元素节点 - 1 2.属性节点 - 2 3.文本节点 - 3 4.注释节点 - 8 5.文档节点 - 9 查看节 ...

  6. JS基础速成(三)- DOM(文件对象模型)

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.DOM树的基本结构 DOM节点分为三大类:元素节点(标签节点),属性节 ...

  7. JS基础学习篇(一)

    近来一直在学习js和jquery.刚刚进入前端工作还没有多久,虽然大学里学习的是编程自认为也学的还可以,但前端接触的不多,一直认为前端十分简单.其实不然,特别是工作的时候要自己设计一个完整的项目前端, ...

  8. vue.js基础知识篇(6):组件详解

    第11章:组件详解 组件是Vue.js最推崇也最强大的功能之一,核心目标是可重用性. 我们把组件代码按照template.style.script的拆分方式,放置到对应的.vue文件中. 1.注册 V ...

  9. vue.js基础知识篇(7):表单校验详解

    目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vue=require("vue&quo ...

  10. vue.js基础知识篇(5):过渡、Method和Vue实例方法

    第8章:过渡 1.CSS过渡 2.JavaScript过渡 3.渐进过渡 第9章:method Vue.js的事件一般通过v-on指令配置在HTML中,虽然也可以在js的代码中使用原生的addEven ...

随机推荐

  1. eay ui iframe 下常问题

    背景:客户要使用https进行登录,把原来的登录做到一个小框,用iframe嵌进来进行登录. 客户拥有4个域名,但只在xxx.com域名中购买了安全证书,所以多个域名下登录所用的iframe中src是 ...

  2. 主机头部分 www有和无是有区别的

    关于主机部分www的问题: case 1: frontend web_service bind *:80 bind *:443 ssl crt /etc/haproxy/cert.pem acl ww ...

  3. poj2761

    表面上看是主席树之类的区间k大 实际上,除了主席树,还可以测各种结构 因为题目中说,任意区间不会完全包含 于是,我们把区间按左端点排序,依次添加,用平衡树求当前的k大 每个狗最多被添加一次,删除一次 ...

  4. 在Silverlight中的DispatcherTimer的Tick中使用基于事件的异步请求

    需求:在silverlight用户界面上使用计时器定时刷新数据. 在 Silverlight 中的 DispatcherTimer 的 Tick 事件 中使用异步请求数据时,会出现多次请求的问题,以下 ...

  5. 关于C#控制台传递参数和接收参数

    前言: 写了这么久程序,今天才知道的一个基础知识点,就是程序入口 static void Main(string[] args) 里的args参数是什么意思 ?惭愧... 需求: 点击一个button ...

  6. NOI2005维修数列

    剧恶心的splay…… 为什么在bzoj上是超时,在自己的电脑上测的是栈溢出…… ; maxc=; var n,m,i,j,y,root,x,posi,t,head:longint; ch:char; ...

  7. 判断String为空

    1.  et_string.equals("")|| et_string==null 2.  ""用equal.null用== TextUtils.isEmpt ...

  8. 【转】基于Android Fragment功能的例子

    原文网址:http://blog.csdn.net/eyu8874521/article/details/8252216 通过最近空闲时候对Fragment的学习,尝试着写了一个小Demo,将在开发的 ...

  9. guake默认快捷键

    toggle guake visibility   切换guake可见 :F12 toggle fullscreen   切换全屏幕 :F11 quit   退出 :Shift+Ctrl+Q new ...

  10. Zabbix探索:使用msmtp进行邮件告警

    在Nagios时代就已经使用msmtp发送告警了,不过那时候偷懒,使用mutt发送来简化格式. 在Zabbix时代,更多人使用msmtp,所以官方论坛上有个zext_msmtp.sh的脚本,但是不要以 ...