简述浏览器事件模型

事件订阅

浏览器的交互师通过浏览器的内置事件响应实现的,常见的浏览器事件有文档载入(load),元素点击(click)等,订阅浏览器事件可以通过如下方式实现。

一、HTML元素属性

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body onload="alert(‘loaded‘)">
</body>
</html>

通过HTML标签的属性直接订阅执行代码。当事件触发时,属性值内的可执行Javascript代码将会被执行,如果遇到未处理异常,代码终止,余下的代码将不会被执行。

二、DOM属性的事件回调

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        window.onload = function (){alert("loaded")};
    </script>
</head>
<body>
</body>
</html>

我们需要给回调参数编写一个function的回调,这种方法比直接在HTML中输入执行代码会优雅一些,但是这种方式也有一个缺点,就是它只能处理一个回调请求。对例子里的window.onload进行多次赋值,将会覆盖原型的回调函数,最终执行的回调函数将会是最后一次赋的值。

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        window.onload = function () {alert("loaded")};
        window.onload = function () {alert("loaded (another handler)")};
    </script>
</head>
<body>
</body>
</html>

如上代码将会弹出“loaded (another handler)” 内容。基于这种特性,我们有了这种方式订阅事件的解绑方案,那就是将对应DOM对象的事件回调属性赋值为null。

三、W3C事件订阅接口

W3C指定了更为灵活的事件订阅机制,window的两个方法addEventListener和removeEventListener。

// type:事件类型
// listen:回调函数
// useCapture:在事件传递的哪个阶段触发
window.addEventListener(type, listen, useCapture);
window.removeEventListener(type, listen, useCapture);

使用addEventListener方法可以为DOM元素的某个事件指定多个回调函数,并且可以单独取消事件订阅。

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        window.addEventListener("load", function(){alert("loaded")}, false);
    </script>
</head>
<body>
</body>
</html>

但是IE8以及以下版本的IE浏览器并不支持这两个方法,它提供了另外一组方法来支持多回调订阅,attachEvent与detachEvent。

// type:事件类型
// listen:回调函数
window.attachEvent(type, listen);
window.detachEvent(type, listen);

并且,IE的type参数与W3C设计的接口参数有些区别,IE的type参数比W3C的type参数前面多了一个on,而且他并不支持指定事件的触发阶段的定制,即他不支持useCapture参数。

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        window.attachEvent("onload", function(){alert("loaded")});
    </script>
</head>
<body>
</body>
</html>

事件传播

浏览器事件传播分为三个阶段,分别是向下捕获、到达目标元素和向上冒泡。一个事件被触发后,完整的事件传播将会经历这三个阶段,并依次通知传播链里的所有文档元素调用自己的订阅处理函数来处理事件。

addEventListener(type, listen, useCapture)的最后一个参数指示了在哪个阶段调用事件回调。如果是true,那么在type事件的捕获阶段将会调用listen方法,如果是false,那么就在冒泡阶段触发。

下面是一个说明传播阶段的实例代码。该代码必须在IE9以及以上IE浏览器/FireFox/Chrome浏览器里执行。在线预览

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>RunJS</title>
    <style>
    #base{
        margin:0 auto;
        padding:50px;
        width:200px;
        height:200px;
        background:red;
    }

    #child{

        width:150px;
        height:150px;
        background:blue;
    }
    </style>
    </head>
    <body>
        <div id="base">
            <div id="child">
                点击
            </div>
        </div>
        <script>
        function S(id){
            return document.getElementById(id);
        }

        S("base").addEventListener("click", function(){alert("父节点捕获阶段")}, true);
        S("child").addEventListener("click", function(){alert("目标捕获阶段")}, true);
        S("child").addEventListener("click", function(){alert("目标冒泡阶段")}, false);
        S("base").addEventListener("click", function(){alert("父节点冒泡阶段")}, false);
        </script>
    </body>
</html>
 
时间: 2024-08-05 12:38:23

简述浏览器事件模型的相关文章

DOM事件模型

DOM 首先,DOM全称是Document Object Model,即文档对象模型.DOM是W3C的标准,定义了访问 HTML 和 XML 文档的标准. “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容.结构和样式.” DOM事件 DOM使Javascript有能力对HTML上的事件做出反应.这些事件包括鼠标键盘的点击事件.移动事件以及页面中内容的变化等.HTML元素事件是浏览器内在自动产生的,当有事件发生时html元素会向外界(这里主要

W3C DOM 事件模型(简述)

1.事件模型 由于事件捕获与冒泡模型都有其长处和解释,DOM标准支持捕获型与冒泡型,能够说是它们两者的结合体.它能够在一个DOM元素上绑定多个事件处理器,而且在处理函数内部,thiskeyword仍然指向被绑定的DOM元素,另外处理函数參数列表的第一个位置传递事件event对象.首先是捕获式传递事件,接着是冒泡式传递,所以,假设一个处理函数既注冊了捕获型事件的监听,又注冊冒泡型事件监听,那么在DOM事件模型中它就会被调用两次. [ oschina] 2.事件传播 A)冒泡模式(Bubble)IE

IE事件模型,如何给IE和非IE浏览器添加事件

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>IE事件模型</title> </head> <body> <input type="button" value="Event对象"/> <p>事件传播过程:</p> <script>

【repost】JavaScript 事件模型 事件处理机制

什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击.鼠标经过某个特定元素或按下键盘上的某些按键.事件还可能是 Web 浏览器中发生的事情,比如说某个 Web 页面加载完成,或者是用户滚动窗口或改变窗口大小. 通过使用 JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应. 今天的事件 在漫长的演变史,我们已经告

DOM事件模型学习笔记

下面的内容属于阅读笔记,其中涉及大量内容来自于PPK的博客的内容,如果你要跟随我的脚步领略大家风采,那么就从Introduction to Events开始阅读吧. 现代的前端开发应该是会严格遵守 html 展示文档内容构成,css 渲染页面效果,javascript 提供交互 浏览器提供交互行为可以追溯到Netscape公司在其第二个版本中支持javascript语言,随后其与微软之间的浏览器大战,以及w3c标准制定的落后,导致至今一直被诟病的浏览器兼容问题,而这些不兼容中关于DOM事件模型的

js中的Dom事件模型以及表格方面等内容

1.实现评论页面的制作 <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #outside{ width: 1000px; margin: 0 auto; border: 1px solid #E7EAEE; overflow: hidden; pad

兼容事件模型

为了客姥爷的用户体验,我们必须做兼容处理,我们可以 1.通过提供统一的api(不兼容就是api不统一,有没有一种越走越远的感觉...),通过鸭辨式找到浏览器提供的相似功能进行兼容 2.使用浏览器提供的最基本的功能进行模拟 兼容模型 在事件模型兼容性中,我们需要兼容以上浏览器,其中ie6,7,8使用的是ie事件模型,其他的则为标准dom模型,可以简单的理解为非ie即dom,大致有2中思路 1.鸭辨式,有dom事件接口即使用,否则就是用ie事件接口 2.通过传统事件模拟事件高阶性质 鸭辨式 Elem

JavaScript事件模型

一.事件流 事件流意味着页面上不止一个元素可以相应相同的事件.逻辑上,每个元素必须能以指定顺序响应事件.事件顺序是IE4.0和Netscapte4.0中支持的事件之间的主要不同点. 1.事件冒泡 对于IE,解决方案是使用事件冒泡技术.基本思想是,事件从事件发生的目标最内部开始出发,向上触发到最外部(document对象). 如果在IE5.5中点击div元素,事件以如下顺序冒泡: 1)<div/> 2).<body/> 3)document 2.事件捕获 事件捕获与冒泡正好相反,它的

ExtJS框架基础:事件模型及其常用功能

前言 工作中用ExtJS有一段时间了,Ext丰富的UI组件大大的提高了开发B/S应用的效率.虽然近期工作中天天都用到ExtJS,但很少对ExtJS框架原理性的东西进行过深入学习,这两天花了些时间学习了下.我并不推荐大家去研究ExtJS框架的源码,虽然可以学习其中的思想和原理,但太浪费精力了,除非你要自己写框架. 对于ExtJS这种框架,非遇到"杂症"的时候我觉得也没必要去研究其源码和底层的原理,对其一些机制大致有个概念,懂得怎么用就行,这也是本篇博文的主要目的. Ext自己的事件机制