BOM和DOM入门(修订)

BOM和DOM入门(修订)

在Web开发中,JavaScript通常与ECMAScript、DOM和BOM一起使用。ECMAScript是JavaScript语言的核心规范,而DOM和BOM是宿主环境(如Web浏览器)提供的API,它们允许JavaScript与网页文档和浏览器本身进行交互。

本文主要介绍DOM和BOM。

浏览器对象模型BOM(Browser Object Model)主要用于管理窗口与窗口之间的通讯。其核心对象是window;window是Javascript顶层对象,表示浏览器的一个实例。它既是JavaScript访问浏览器窗口的一个接口,又是ECMScript规定的Global对象。其他BOM对象均为window对象的子对象,被作为window对象的属性来引用。

BOM 描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本,对Cookie的支持等。

文档对象模型DOM(Document Object Model),用于表示和操作HTML文档内容的基础API;

DOM 将HTML文档呈现为带有元素、属性和文本的树结构(节点树)。

DOM 描述了处理网页内容的方法和接口,是HTML和XML的API,DOM把整个页面规划成由节点层级构成的文档。

☆BOM

浏览器对象模型(Browser Object Model,简称BOM)是对浏览器窗口进行访问和操作的功能接口。例如,弹出新的浏览器窗口、获取浏览器信息等。注意,BOM是作为JavaScript的一部分而不是作为W3C组织的标准,每款浏览器都有自己的实现方式,这会导致BOM代码的兼容性不如ECMAScript和DOM代码的兼容性。

对象层次结构参见下图,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。

从上图可以看出:DOM是属于BOM的一部分(Document 对象是 Window 对象的一部分):DOM的最根本的对象document是BOM的最根本window对象的子对象。

window对象是BOM的顶层(核心)对象,它表示浏览器的一个实例,对于每个打开的窗口,系统都会自动为其定义window对象。或者说,Window 对象表示浏览器中打开的窗口。其它对象都是通过它延伸出来的,也可以称为window的子对象。

window对象既是ECMAScript规范中的Global对象,也是BOM中的顶级对象;window对象是相对于web浏览器而言的,依赖于浏览器。

global对象可以说是ECMAScript中对特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。从某种意义上讲,它是一个终极的“兜底儿对象”,换句话说呢,就是不属于任何其他对象的属性和方法,最终都是它的属性和方法。比如isNaN()、parseInt()以及parseFloat()等,实际都是它的方法;还有就是常见的一些特殊值,如:NaN、undefined等都是它的属性,以及一些构造函数Object、Array等也都是它的方法。总之,记住一点:global对象就是“老祖宗”,所有找不到归属的就都是它的。

document对象既是BOM顶级对象的一个属性,也是DOM模型中的顶级对象。文档对象模型(Document Object Model,简称DOM)是针对HTML和XML文档的一个API((ApplicationProgramming Interface,应用程序编程接口)),现在已经成为表现和操作页面标记的真正的跨平台、语言中立的一种标准。

document对象是window对象的一个属性,是显示于窗口内的一个文档。而window对象则是一个顶层对象,它不是另一个对象的属性。document可以理解为文档,就是你的网页,而window是你的窗口,就是你的浏览器包含的。它们俩在没有框架的情况下可以说是等同的,在有框架的情况下就要区别对待了。

location对象既是window对象的属性,同时也是document对象的属性。换句话说,window.location和document.location引用的是同一个对象。

另一种对象层次结构图示如下,注意,图中有些对象是全小写的,有些是以大写字母开头的。以大写字母开头的对象表示,引用该对象不使用下表列出的名字,而直接用对象的“名字”(Id 或 Name),或用它所属的对象数组指定。

☆DOM

文档对象模型(Document Object Model,简称DOM)是W3C组织推荐的处理可扩展标记语言(HTML或XML)的标准编程接口(API)。网页上组织页面(或文档)的对象被组织在一个树形结构中,通过DOM操作的方式可以让页面跟JavaScript进行通信或交互。DOM树展示,如下图所示:

DOM用于操控HTML和CSS的标签结构(即节点)——用 DOM API可以轻松地删除、添加和替换节点,从而使开发者对文档的内容和结构具有空前的控制力。

这是很简单的情况,实际上现实使用的要复杂的多。

简单地说,BOM描述了与浏览器进行交互的方法和接口, 是为了操作浏览器出现的 API(应用程序接口),DOM 述了处理网页内容的方法和接口,是为了操作文档出现的 API(应用程序接口),DOM是属于BOM的一部分。

下面介绍BOM和DOM的使用,首先指出,这部分内容很繁杂,在本文中仅选择介绍了我认为比较重要的一部分。

window对象的使用

window对象代表当前打开的浏览器窗口,其作为顶级对象。window对象的方法和属性的调用和其它对象一样,区别是window对象不需要创建即可直使用。需要注意的是window对象名称是小写,下面是其属性和方法的调用语法。

window.属性名

window.方法名(参数列表)

并且,因为window是顶级对象,可以省略window不写。

window对象事件

网页加载完毕时激发一个onload事件;

unload事件是在浏览器窗口卸载文档时所激发的事件。

得到焦点是指浏览器窗口为当前的活动窗口,得到焦点时触发窗口对象的focus事件。

使用window对象的open方法可以打开一个新的浏览器窗口,新窗口作为本窗口的子窗口。相应的本窗口作为新窗口的次窗口,并持有对新窗口的一个引用,通过该引用可以适度的操作新窗口。open方法的语法如下:

window.open(url,name,features,replace)

其中,features是描述窗口的特征, replace指明是否允许url替换窗口的内容。详细情况可参见: Window.open() - Web API 接口参考 | MDN

例子、在新窗口打开百度,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>关闭窗口</title>
</head>
<body>
<script>
function op()
{
       window.open("http://www.baidu.com","baidu","heigth=300,width=200");
}
</script>
http://www.baidu.com <br>
<label>
<input type="submit" name="Submit" onClick="op()" value="打开" >
</label>
</script>
</body>
</html>

保存文件名为:打开窗口.html

你可以运行之试试。

如果获得一个window对象的引用时,通过该引用去调用其close方法就可以关掉一个与之相关的窗口。通常情况下,父窗口通过这种方式关闭子窗口。语法如下:

窗口名.close()

关闭窗口例子代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>关闭窗口</title>
</head>
<body>
<script>
function closeWindow()
{     
       if(self.closed)
       {
              alert("窗口已经关闭")
       }
       else
       {
              self.close()
       }
}
</script>

<label>
<input type="submit" name="Submit" onClick="closeWindow()" value="关闭" >
</label>
</script>
</body>
</html>

保存文件名为:关闭窗口.html

你可以运行之试试。

屏幕对象 (screen)的使用

屏幕对象(screen)提供了获取显示器信息的功能,检测显示器参数。显示的参数一般都包括显示面积的宽、高度和色深等,其中宽、高度是比较有意义的,直接与网布局相关,色深只是影响图形色彩的逼真程度 。

显示器分辨率是指显示器所能显示的宽度和高度,通常以像素(pixel)为单位。在实际应用中,为了使制作的网页能适应不同的浏览器环境,最好使用JavaScript程序对用户的显示器进行检测,动态调整网页的布局 。

检测显示器的参数

<Script>

with (document)

{

     write ("您的屏幕显示设定值如下:<p>");

     write ("屏幕的实际高度为", screen.availHeight, "<br>");

     write ("屏幕的实际宽度为", screen.availWidth, "<br>");

     write ("屏幕的色盘深度为", screen.colorDepth, "<br>");

     write ("屏幕区域的高度为", screen.height, "<br>");

     write ("屏幕区域的宽度为", screen.width);

}

</Script>

检测显示器的分辨率

<script>    

document.write("您的屏幕分辨率是"+screen.width+" * "+screen.height);   // 分辨率    

</script>  

DOM的使用

下面开始介绍DOM(Document Object Model,文档对象模型)的使用。

Document对象包含当前文档的信息,例如:标题、背景、颜色、表格等。

常用方法:

(1)通过write()/writeln()方法在浏览器中显示内容。

(2)获得当前文档中的元素、属性和节点信息(例如:通过“document.formName”来获得表示页面中的表单名称为fromName的表单对象)。

(3)getElementById()和getElementByTagName()。这两个方法会忽略文档的结构,可查找整个HTML文档中的任何元素(不论它们在文档中所处的位置,例如通过getElementByTagName()可以把文档中所有的<p>元素找到)。

文档对象(document对象),为操作HTML文档提供接口,拥有大量的属性和方法,它有大量的子级对象,例如图像对象、超级接对象、表单对象等等 。不需要手工创建,在文档初时化时就已经由系统内部创建。直接调用其方法或属性即可。

DOM 定义了多种查找元素的方法: getElementById() 、getElementsByName() 和 getElementsByTagName()。

getElementById() 方法的语法:

document.getElementById(elementID)

getElementById() 方法的语法:

document.getElementById(elementID)

其中,elementID 必须,String类型的元素ID属性值。

返回指定ID的元素对象。

获取元素

document文档指整个页面的根对象(最外层对象),通过document文档获取页面中的具体HTML元素。注意document文档的类型为对象类型,即typeof document返回object值,因此,通常document文档亦称document对象。document文档页面的最外层如图所示。

document文档页面的最外层如下图所示:

document对象常见属性如下:

document.doctype 用于获取或设置文档头信息

document.documentELement 用于获取或设置<html>标签

document.head 用于获取或设置<head>标签

document.body 用于获取或设置<body>标签

document.title <用于获取或设置title>标签。

可以先通过给元素添加id属性,如:

<… id="xxx" …>

然后,通过document对象的getElementById()方法——把id值通过字符串形式放到此方法的小括号中,获取元素。除了获取元素外,也可以对元素的属性进行设置。

在前面,讲解了DOM操作HTML元素的属性,同样对HTML元素的style属性也能够获取和设置。

getElementById()方法可以获取到指定id的HTML元素。那么,如何获取一个HTML元素集合呢?例如,一组<li>标签。可以通过getElementsByTagName()方法来实现,该方法通过指定HTML标签名的方式来获取。

注意,一组标签即可以在整个document文档下获取,也可以在指定的祖先元素下获取。此方式与getElementById()方法不一样,getElementById()方法只能在document文档下获取,因为id属性具有唯一性,不存在包含关系。

获取到元素集合后,如何去操作?在JavaScript语法中不能直接去操作整体集合,必须分别操作集合的每一项元素。可以通过“[]+下标”的方式获取指定集合中的某一项元素,下标从0开始。例如,li[0]表示li集合中的第一个元素,li[1]表示li集合中的第二个元素。

可以通过集合对象下面的length属性获得集合内元素的个数。获取到集合的长度,再配合循环语句,就可以对一组HTML元素集合操作。

下面给出九九表一个例子

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script>
function secondFunction(){
    var div = document.getElementById("div1");
     for (var i = 1; i < 10; i++) {
          for (var j = 1; j <= i; j++) {
               div.innerHTML += j + "*" + i + "=" + (i*j) ;
               div.innerHTML += "  "
           }
           div.innerHTML += "<br>" ;
     }
}
</script>
</head>
<body>
<input type="button" onclick="secondFunction()" value="显示九九表">
<div id="div1"></div>
</body>
</html>

保存文件名为:九九表.html

你可以运行之试试。

From对象:
Form对象是document下的一个子对象,表示表单对象(From对象)。

DOM的forms 集合

表单就是<form></form>之间部分,一个网页可以有多对<form></form>即可以有多个表单,JavaScript会为每个表单创建一个Form对象,形成一个forms 集合,并将这些Form对象存放在forms[]数组中。

forms 集合返回当前页面所有表单(form)的数组集合。

语法

document.forms[索引值或表单名字符串]

如document.forms[0] 是你网页中的第一个表单,索引(index)从0开始。

document.forms("form")表示document里名字叫form的那个表单。

文档中的<form>标记确定了文档中文档对象的顺序,这种引用对象的方法就是引用表单的一种方法,因此可以使用表单名来引用。

表单的元素有很多,这些表单元素可以让用户输入文字,如文本框、密码框等;或者让用户选择可选项,如下拉列表框、复选框等;也可以让用户提交信息或重置表单,如提交按钮、重置按钮等;甚至还可以为程序员提供开发上的便利,如隐藏框等。这些都时表单对象的子对象。

form对象中可以使用elements[]数组来获得代表这些表单元素的子对象。elements[]数组中存放的是各种类型的form对象的子对象,elements[]数组中的元素是由<form>标签与</form>标签之间表单元素所组成的,因此可以使用以下代码来获得代表HTML文档中的第1个Form对象中的第2个元素的对象。

表单元素访问方法

var str1=form1.elements[0].value;  //元素命名访问方法一

var str2=form1.text3.value; //元素命名访问方法二

var str3=document.forms[1].elements[0].value; //元素命名访问方法三

代表多行文本框的对象称为textarea对象、代表文本框的对象称为text对象、代表密码框的对象称为password对象。

HTML创建多行文本框、单行文本框、密码文本框示例见下面表单(form)的例子

【关于HTML元素参考HTML 元素参考 - HTML(超文本标记语言) | MDN 】

表单(form)的例子,代码如下:

<!doctype html>
<html>
<head>
<title>表单示例</title> <!--文档的头各标题-->
<script>        //JavaScript程序
function img()
{
    for(i=0;i<document.forms[1].length-1;i++)
    {
        document.Myform.showMsg.value +=document.forms[1].elements[i].value+"\n";  //第i-1个<form>标签 
    }
    alert(Myform.showMsg.value); //用对话框的形式显示信息
}
</script>     <!-- JavaScript结束标签-->
</head>     <!--JavaScript头的>结束 -->
<body>   
<form name="Myform">     <!--表单-->
  <p>显示个人信息</p>     <!--带文本的段落-->
  <p>            <!--段落-->
    <textarea name="showMsg" cols="40" rows="8" ></textarea>
  </p>            <!--段落结束-->
 </form>            <!--表单结束-->
<form name="form1" method="post" action="">  <!--创建一个表单-->
  个人信息<br> 
    姓名:<input type="text" name="Name"  >        <!--姓名文本模框-->
  <p>
    性别:<input type="text" name="sex">      <!--性别文本模框-->     
  </p>
  <p>
  学号:<input type="text" name="num">     <!--学号文本模框-->   
  <label>
  <input type="submit" name="Submit" value="提交" onClick="img()"> <!--提交表单调用img函数--> 
  </label>
  </p> 
</form>
</body>
</html>

保存文件名为:表单(form)的例子.html

你可以运行之,参见下图:

DOM中的事件

事件(event)是一些特定动作发生时所发出的信号,此信号发生时可以触发(引发)执行相应的事件处理程序,你可以为事件编写相应的事件处理程序——事件触发时 JavaScript 可以执行一些代码。HTML页(Web页)事件可以是浏览器行为,也可以是用户行为。

【事件驱动程序设计(Event-driven programming)是一种电脑程序设计模型。这种模型的程序运行流程是由用户的动作(如鼠标的按键,键盘的按键动作)或者是由其他程序的消息来决定的。】

JavaScript中使用了异步事件,也就是说:JavaScript中的事件都是异步执行的。

下面是一些常见的HTML事件的列表:

事件

描述

onchange

HTML 元素改变

onclick

用户点击 HTML 元素

onmouseover

用户在一个HTML元素上移动鼠标

onmouseout

用户从一个HTML元素上移开鼠标

onkeydown

用户按下键盘按键

onload

浏览器已完成页面的加载

事件处理程序的名字以“on”开头。

例1、给按钮绑定点击事件(onclick)

<!DOCTYPE html>
<html>
<head>
<title>给按钮绑定单击事件</title>
 <meta charset="utf-8">
<script>
function displayDate()
{
document.getElementById("demo").innerHTML=Date();
}
</script>
</head>
<body>
<h1>给按钮绑定单击事件(onclick)</h1>
<p id="demo">这是一个段落.</p>
<input type="button" onclick="displayDate()" value="显示Date">
</body>
</html>

保存文件名为:给按钮绑定单击事件.html

运行之,参见下图:

下面简要介绍JS事件触发操作步骤:

原生js之document.createEvent建立自定义事件 - 博客sl - 博客园

createEvent:创建事件

initEvent:初始化事件

dispatchEvent:调度、发出事件

如:

var e = document.createEvent("HtmlEvents");

e.initEvents("事件名",true,true);

元素对象.dispatchEvent(e);

下面给出完整的例子

例2、JS事件触发示例

<!DOCTYPE html>
<html>
<head>
  <title>事件触发</title>
  <meta charset="utf-8">
</head>
<body>
  <select id="sel">
    <option>中国</option>
    <option>美国</option>
    <option>日本</option>
    <option>韩国</option>
  </select>
  <hr>
  <div id="div" style="width:300px;height:150px;border:solid 1px red;"></div>
  <script type="text/javascript">
    var sel = document.getElementById("sel");
    var div = document.getElementById("div");
    // 设置change事件后处理函数
    sel.onchange = function(){
      div.innerHTML = sel.options[sel.selectedIndex].text; //拿到选中的option的文本填充到div里
    }
    // 触发change事件的函数
    function dispatchChange(){
      var changeEvent = document.createEvent("HtmlEvents");
      changeEvent.initEvent("change",true,true);
      sel.dispatchEvent(changeEvent);
    }
    dispatchChange();
  </script>
</body>
</html>

保存文件名为:事件触发示例.html

你可以运行测试之。

附录

一、JavaScript之BOM和DOM操作详细总结 【JavaScript教科书】JavaScript之BOM和DOM操作详细总结_奈何的人生-CSDN博客

二、Window对象基本操作思维导图

三、DOM基本操作思维导图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值