DOM和BOM区别

DOM:文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM。

Bom:浏览器对象模型(Browser Object Model,简称 BOM)提供了独立于内容而与浏览器窗口进行交互的对象。描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作.

1:DOM和BOM的处理对象不同:DOM控制图中虚线范围,BOM控制图中实线范围。

   

DOM将文档简报为下图:

 

DOM

DOM 是遵循 W3C(万维网联盟)的标准。
DOM 定义了访问 HTML 和 XML 文档的标准:
"W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"
W3C DOM 标准被分为 3 个不同的部分:
  • 核心 DOM - 针对任何结构化文档的标准模型
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型

XML DOM

XML DOM 是: [1] 
  • 用于 XML 的标准对象模型
  • 用于 XML 的标准编程接口
  • 中立于平台和语言
  • W3C 标准
XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法(接口)。
换句话说:XML DOM 是用于获取、更改、添加或删除 XML 元素的标准。

HTML DOM

HTML DOM 是: [2] 
  • HTML 的标准对象模型
  • HTML 的标准编程接口
  • W3C 标准
HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法(接口)。
换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

DOM的分级

编辑
根据W3C DOM规范,DOM是HTMLXML的应用编程接口(API),DOM将整个页面映射为一个由层次节点组成的文件。有1级、2级、3级共3个级别。

1级DOM

1级DOM在1998年10月份成为W3C的提议,由DOM核心与DOM HTML两个模块组成。DOM核心能映射以XML为基础的文档结构,允许获取和操作文档的任意部分。DOM HTML通过添加HTML专用的对象与函数对DOM核心进行了扩展。

2级DOM

DOM DOM
鉴于1级DOM仅以映射文档结构为目标,DOM 2级面向更为宽广。通过对原有DOM的扩展,2级DOM通过对象接口增加了对鼠标和用户界面事件(DHTML长期支持鼠标与用户界面事件)、范围、遍历(重复执行DOM文档)和层叠样式表(CSS)的支持。同时也对DOM 1的核心进行了扩展,从而可支持XML命名空间。
2级DOM引进了几个新DOM模块来处理新的接口类型:
DOM视图:描述跟踪一个文档的各种视图(使用CSS样式设计文档前后)的接口;
DOM事件:描述事件接口;
DOM样式:描述处理基于CSS样式的接口;
DOM遍历与范围:描述遍历和操作文档树的接口;

3级DOM

3级DOM通过引入统一方式载入和保存文档和文档验证方法对DOM进行进一步扩展,DOM3包含一个名为“DOM载入与保存”的新模块,DOM核心扩展后可支持XML1.0的所有内容,包括XML Infoset、 XPath、和XML Base。

0级DOM

当阅读与DOM有关的材料时,可能会遇到参考0级DOM的情况。需要注意的是并没有标准被称为0级DOM,它仅是DOM历史上一个参考点(0级DOM被认为是在Internet Explorer 4.0 与Netscape Navigator4.0支持的最早的DHTML)。

节点

根据 DOM,HTML 文档中的每个成分都是一个节点。
DOM 是这样规定的:
整个文档是一个文档节点
每个 HTML 标签是一个元素节点
包含在 HTML 元素中的文本是文本节点
每一个 HTML 属性是一个属性节点
注释属于注释节点

Node 层次

节点彼此都有等级关系。
HTML 文档中的所有节点组成了一个文档树(或节点树)。HTML 文档中的每个元素、属性、文本等都代表着树中的一个节点。树起始于文档节点,并由此继续伸出枝条,直到处于这棵树最低级别的所有文本节点为止。
下面这个图片表示一个文档树(节点树):
节点树示意图 节点树示意图

文档树

请看下面这个HTML文档:
<html>
<head>
<title>DOM Tutorial</title>
</head>
<body>
<h1>DOM Lesson one</h1>
<p>Hello world!</p>
</body>
</html>
上面所有的节点彼此间都存在关系
除文档节点之外的每个节点都有父节点。举例,<head> 和 <body> 的父节点是 <html> 节点,文本节点 "Hello world!" 的父节点是 <p> 节点。
大部分元素节点都有子节点。比方说,<head> 节点有一个子节点:<title> 节点。<title> 节点也有一个子节点:文本节点 "DOM Tutorial"。
当节点分享同一个父节点时,它们就是同辈(同级节点)。比方说,<h1> 和 <p>是同辈,因为它们的父节点均是 <body> 节点。
节点也可以拥有后代,后代指某个节点的所有子节点,或者这些子节点的子节点,以此类推。比方说,所有的文本节点都是 <html>节点的后代,而第一个文本节点是 <head> 节点的后代。
节点也可以拥有先辈。先辈是某个节点的父节点,或者父节点的父节点,以此类推。比方说,所有的文本节点都可把 <html> 节点作为先辈节点。

优点和缺点

 

DOM的优势主要表现在:易用性强,使用DOM时,将把所有的XML文档信息都存于内存中,并且遍历简单,支持XPath,增强了易用性。
DOM的缺点主要表现在:效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用。另外效率低还表现在大量的消耗时间,因为使用DOM进行解析时,将为文档的每个element、attribute、processing-instruction和comment都创建一个对象,这样在DOM机制中所运用的大量对象的创建和销毁无疑会影响其效率。
 
 
BOM表如下图:

 (1)window对象:当前浏览器窗体
        属性:
          status:状态栏(目前浏览器已弃用了)

          opener:即谁打开我的,若在A用open打开B则B的opener就是A

          closed:判断子窗体是否关闭

        方法:
          alert()  弹出框

          confirm() 带确认,取消弹出框

          setInterval() 每隔多少秒调用一次

          clearInterval() 清除setInterval

          setTimeout() 隔多少秒调用一次

          cleartimeout() 清除setTimeout

          open() 打开一个新的窗口

           eg :  window.open("other.html"," _blank","width=200,height=300,top=300");   

          console:最常用的就是console.log()浏览器控制台打印
    (2)子对象:doument loation history screen ……

      1、 doument  (讲dom已经介绍过它的属性方法 ,有感兴趣的可以翻看dom操作)

      2、 loation 跳转位置
        <meta http-equiv="refresh" content="3; url =http://www.hteis.cn";>      //不加url指3秒刷新一次,加url指3秒跳转
        window.location.href="popl.html";
        location = pop.html
        location.replace("pop.html") //浏览器不可以后退

      3、 history 历史
        history.back() == history.go(-1)   //返回到前一页
        history.go(-2) //括号里的参数负几就是返回前几步

        eg: <a href="javascript:history.back()">返回上一页</a>

          <a href="javascript:history.go(-2)">第一页</a>


      4、 screen //屏幕
        screen.availHeight //屏幕实际高度
        screen.availWidth //屏幕实际宽度
        screen.height //屏幕高度
        screen.width //屏幕宽度 

        console.log("屏幕实际高度"+screen.availHeight);
        console.log("屏幕实际宽度"+screen.availWidth);
        console.log("屏幕高度"+screen.height);
        console.log("屏幕宽度"+screen.width);

最后赋一个使用计时器做的小例子,跑马灯和小球运动效果

复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #one{
                width:100px;
                height: 100px;
                background-color: red;
                position: fixed;
                left:0;
                top:0;
                border-radius: 50%;
            }
            #two{
                width:100px;
                height:20px;
                background-color: #0f0;
                position: fixed;
                right:10px;
                top:10px;
            }
            html,body{
                width:100%;    
                height:100%;
            }
        </style>
    </head>
    <body>
        <div id="one"></div>
        <div id="two">跑起来</div>
        <script>
            var x = 0;
            var y = 0;
            var xs=10;
            var ys=10;
            var left = document.body.clientWidth;
            var one = document.getElementById("one");
            var two = document.getElementById("two");
            function move(){
                x += xs;
                y += ys;
                if(x >= document.body.clientWidth-one.offsetWidth-20 || x < 0){
                    xs=-1*xs;
                }
                if(y >= document.body.clientHeight-one.offsetHeight-20 || y < 0){
                    ys=-1*ys;
                }
                
                one.style.left = x+"px";
                one.style.top = y+"px";
            }
            var dt = setInterval("move()",100);
            one.onmouseover = function(){
                clearInterval(dt)
            }
            one.onmouseout = function(){
                dt = setInterval("move()",100);
            }

            //跑马灯
            function leftMove(){
                if(left <=100){
                    left =  document.body.clientWidth;
                }
                left=left-10;
                two.style.left = left+"px";
            }
            
            var dl = setInterval("leftMove()",100);
            two.onmouseover = function(){
                clearInterval(dl);
            }
            two.onmouseout = function(){
                dl = setInterval("leftMove()",100);
            }
        </script>
    </body>
    </html>
posted @ 2018-11-11 21:11  24K纯shuAI  阅读(448)  评论(0编辑  收藏  举报