轻松学习JavaScript二十七:DOM编程学习之事件模型

在介绍事件模型之前,我们先来看什么是事件和什么是event对象。

一事件介绍

JavaScript事件是由訪问Web页面的用户引起的一系列操作,使我们有能力创建动态页面。事件是能够被

JavaScript侦測到的行为。

网页中的每一个元素都能够产生某些能够触发JavaScript函数的事件。例如说。我们能够在用

户点击某button时产生一个onclick事件来触发某个函数。事件在HTML页面中定义;事件通常与函数配合使用,当事件

发生时函数才会运行;事件一般用于浏览器和用户操作进行交互。

我们经经常使用到的事件举例:鼠标点击,页面或图像加载,鼠标悬浮于页面的某个热点之上,在表单中选取输入

框,确认表单。键盘按键等等。

二event对象

Event对象代表事件的状态,比方事件在当中发生的元素、键盘按键的状态、鼠标的位置、鼠标button的状态。

件通常与函数结合使用,函数不会在事件发生前被运行!

当触发某个事件时,会产生一个事件对象。这个对象包括着全部与事件有关的信息。包括导致事件的元素。事件

的类型,以及其他与特定事件相关的信息。事件对象我们一般称作event对象。这个对象是浏览器通过函数把这个对

象作为參数传递过来的。那么我们能够验证一下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>DOM</title>
<script type="text/javascript">
//定义的普通函数
function box(){
   alert(arguments.length);//输出:0
};
//函数调用
box();

window.onload=function(){
    //得到input对象
    var input=document.getElementsByTagName("input")[0];
    //匿名函数运行
    input.onclick=function(){
          alert(arguments.length);//输出:1,得到一个隐藏的參
          alert(arguments[0]);//输出:object MouseEvent表示鼠标事件对象
    };
}
</script>
</head>

<body>
<input type="button" value="按钮" />
</body>
</html>

通过上面两组函数,我们得到。通过事件绑定的运行函数是能够得到一个隐藏參数的,说明浏览器会自己主动分配一

个參数,这个參数就是为event对象。我们是能够直接接受event对象的,W3C和IE分别用不同的方法得到:W3C的是

直接传递event对象作为參数,而IE须要使用window.evevt才干获取得到。

我们来做一下兼容:

window.onload=function(){
    //得到input对象
    var input=document.getElementsByTagName("input")[0];
    //匿名函数运行
    input.onclick=function(event){
            var event=event||window.event;
            alert(event);//输出:object MouseEvent表示鼠标事件对象
    };
}

我们既然得到event对象,因此我们能够操作一些event对象的属性和方法:

标准Event属性

标准Event方法

因为DOM2级标准事件模型,IE9之前的低版本号浏览器并不支持。IE9已经全面支持了。我们就不再做浏览器兼容

的属性和方法。

在真正用到的时候我们再进行视情况而定的兼容。

三事件模型

(1)内联模型

内联模型是最传统接单的一种处理事件的方法。在内联模型中,事件处理函数是HTML标签的一个属性。用于处

理指定事件。尽管内联在早期使用较多,可是它是和html混写的,并没有与html分离,而且写入的代码数量非常少,并

不有用。

以下看一个内联模型的演示样例:

<!--在HTML中把事件处理函数作为属性运行JS代码-->
<input type="button" value="按钮" onclick="alert('I am JS code!');" />

另一个内联模型的应用,这个也实现了JS代码和HTML一定的分离。但还是属于内联模型。JS函数写在JS文件

中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>DOM</title>
<script type="text/javascript">
function box(){
   alert("I am JS code!");
}
</script>
</head>

<body>
<!--在HTML中把事件处理函数作为属性运行JS函数-->
<input type="button" value="按钮" onclick="box();" />
</body>
</html>

(2)脚本模型

因为内联模型违反了HTML与JavaScript代码层次分离的原则,为了解决问题。我们尝试在JavaScript中进行

事件处理。这样就产生了脚本模型。示比例如以下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>DOM</title>
<script type="text/javascript">
window.onload=function(){
    //得到input对象
    var input=document.getElementsByTagName("input")[0];
    //匿名函数运行
    input.onclick=function(){
         alert("I am JS code!");
    };
}
</script>
</head>

<body>
<input type="button" value="按钮" />
</body>
</html>

通过匿名函数能够运行onclick事件,即能够直接触发相应的代码。还有还有一种方式也能够实现,那就是通过指定

的函数名赋值的方式来运行函数,注意赋值的函数名不要带着括号。

和上面有差别的就是JS代码部分:

window.onload=function(){
    //得到input对象
    var input=document.getElementsByTagName("input")[0];
    //通过赋值指定的函数名运行
    input.onclick=box;
	function box(){
           alert("I am JS code!");
    };
}

(3)DOM2级模型

在介绍DOM2模型之前我们的先了解什么是事件流。

事件流是描写叙述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候,那么你点击当中一个元

素。并非仅仅有当前被点击的元素会触发事件,而层叠在你点击范围内的全部元素都会出发事件。事件流包含两种模

式:冒泡和捕获。

以下的图示非常好的展示了事件流:

事件冒泡,是从里往外逐个触发。事件捕获。是从外往里逐个触发。

现代浏览器默认情况下都是冒泡模型。我们

能够使用DOM2级模型的事件绑定机制手动定义事件流模式。

在全部的现代浏览器其中——除了IE9之前的版本号,都实现了DOM2标准事件模型。这个事件模型规定:每个

DOM元素所触发的事件都要经历三个阶段:捕获阶段;目标对象本身的事件处理程序调用阶段;冒泡阶段。

冒泡阶段:当文档元素上发生某个类型的事件时。他们会在文档树上向上传播,即调用父元素的同样类型的事件

处理函数。

捕获阶段:捕获阶段像是反向的冒泡阶段。

最先调用window对象的捕获处理程序,然后是document对象的捕获处

理程序,接着是body对象的,再然后是Dom树向下。以此类推。直到调用事件目标元素的父元素的捕获事件处理程

序。在目标元素对象本身上注冊捕获事件处理程序不会被调用。

在DOM2级标准事件模型中。为一个DOM元素绑定事件的方法是addEventListener()方法,这种方法要求传递三

个參数,第一个參数为一个字符串。表示事件的类型。如"click";第二个參数是一个函数。表示事件处理程序,浏览

器会默觉得该函数传递一个事件对象也就是event对象;第三个參数是一个布尔值,布尔值为false表示此函数将注冊

为冒泡事件处理程序(通常设置为false就可以),假设值为true,表示此函数将注冊为捕获事件处理程序。值得注意的

是,能通过多次调用addEventListener()方法为同一个对象注冊同一事件类型的多个处理程序函数。当对象上发生事

件时,全部该事件类型的注冊处理程序都会依照注冊的顺序调用。

分析事件的触发过程,分两种情况:

1当目标元素不存在父元素或目标元素的父元素并没有注冊与触发目标元素同样类型的事件时,事件模型的第一

和第三阶段是没有实际意义的,即不会发生不论什么的事情。

2当目标元素存在父元素且目标元素的父元素注冊了与触发目标元素同样类型的事件时。事件模型的第一和第三

阶段就開始起作用了。

我们在这里看一个非常easy的样例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>DOM</title>
<script type="text/javascript">
window.addEventListener("load",function(){
       alert("I am JS code!");
},false)
</script>
</head>

<body>
<input type="button" value="按钮" />
</body>
</html>

上面的addEventListener()方法IE9之前的低版本号浏览器并不兼容,而且进行绑定的时候会有诸多的问题出现。IE

不支持捕获,仅仅支持冒泡;IE加入事件不能屏蔽反复的函数。IE中的this指向的是window对象而不是DOM对象。可能

对于低版本号的IE浏览器不兼容。可是IE9全然支持W3C中的事件绑定函数。

对于怎么做到兼容。还是在详细的实际项

目中灵活应用。

时间: 2024-07-29 04:38:00

轻松学习JavaScript二十七:DOM编程学习之事件模型的相关文章

轻松学习JavaScript二十二:DOM编程学习之节点操作

DOM编程不仅仅可以查找三种节点,也可以操作节点,那就是创建,插入,删除,替换和复制节点.先来看节点 操作方法: 还是借用一贯的HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.

GUI学习之二十七——布局管理学习总结

今天讲一个大的内容——布局管理. 一.布局管理的诞生背景 在前面所讲的所有案例中,我们都是用采用手动布局的方式来布局的.结合个案例来说明一下:在一个界面上放三个label,三个label纵向排列 from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.resize(600,400) self.UI_test() def UI_test(self): l

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr

DOM编程 学习笔记(一)

PS:虽然自己JS基本语法算是掌握了,但是其实在JS掌握的只是远远还不够,网页上有太多好看的动态效果都是用JS 做出来的,自己也就仅仅会那么一两个动态的效果,学的只是皮毛...等有空的时候一定要好好的研究那些动态效果 的制作,实在是太炫酷了...先开始DOM的基本语法吧...等DOM和JQuery的基本语法和用法搞定后就去深入的研究 研究那些动态效果的制作... DOM编程 学习内容 1.DOM简单介绍 2.DOM解析方式 3.在网页中使用DOM编程 4.DOM window对象以及Loacti

angular学习笔记(二十七)-$http(5)-使用$http构建RESTful架构

在angular中有一个特别为RESTful架构而定制的服务,是在$http的基础上进行了封装. 但是为了学习,我们先看看用直接$http是如何构建RESTful架构的: 假设有一个银行卡的列表.需要的功能有: 可以通过id来获取用户123的指定id的卡     'GET'  'card/user/123/id' 可以获取用户123的所有的银行卡             'GET'  'card/user/123' 可以更新用户123的指定id的卡                'POST' '

Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图

Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图 ExpandableListView可折叠列表 这一节我们介绍第三个用适配器的控件,ExpandableListView可折叠列表.这个控件可以实现我们在QQ中非常常见好友分组功能,ExpandableListView是ListView的子类,用法跟ListView差不多,下面我们来学习这个控件的基本使用: 常用属性: android:childDivider:指定各组内子类表项之间的分隔条,

javascript JavaScript强化教程——DOM编程性能优化

本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 ——DOM编程性能优化 DOM的访问与修改访问DOM元素是有代价的——修改元素侧更为昂贵,因为他会导致浏览器重新计算页面的几何变化.当然,最坏的情况是在循环中访问或修改元素,尤其是对HTML元素几何循环操作.为了让你对DOM编程带来的性能问题有个量化的了解,请看下面的简单实例: function innerHTMLLoop(){ for(var count = 0;count<15000;count++)

JavaScript强化教程——DOM编程(两种控制div移动的方法)

本文为H5EDU机构官方HTML5培训教程,主要介绍:JavaScript强化教程--DOM编程(两种控制div移动的方法) 第一种 按钮控制首先 创建两个html按钮和一个div并给div一个样式 input type="button" value="左" id="1"> <input type="button" value="右" id="2"> <div i

轻松学习JavaScript二十三:DOM编程学习之操作表格

一使用HTML标签创建表格: 代码: <span style="font-size:18px;"><table border="1px"width="300px"> <caption>人员表</caption> <thead> <tr> <th>姓名</th> <th>性别</th> <th>年龄</th>