0

0

对js中事件模型的解析

不言

不言

发布时间:2018-07-14 14:49:31

|

1458人浏览过

|

来源于php中文网

原创

这篇文章主要介绍了关于javascript中的事件模型,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

0. 事件与事件流

        事件是浏览器与文档交互的瞬间,如点击按钮、填写表格等操作,它是Javascript与HTML之间沟通的桥梁。DOM是树状结构,如果同时给父节点都绑定事件时,当触发子节点的时候,这两个事件的发生顺序就牵涉到事件流的内容,它描述的是页面接受时间的顺序。事件流描述的是从页面接收事件的顺序,但比较有意思的是IE和Netscape开发团队居然提出了差不多完全相反的概念。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流。

       从而使得 事件流主要分为两种:事件冒泡和事件捕获。

        IE的事件流叫做事件冒泡,即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。Netscape团队提出的另一种事件流叫做事件捕获(event capturing),事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。捕获的用意在于在事件到达预定目标前捕获它。

        DOM2级事件规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。

1. DOM0级事件模型   

        DOM0级事件模型是早期的事件模型,又称为原始事件模型,在该模型中,事件不会传播,即没有事件流的概念。事件绑定监听函数较为简单,要使用Javascript指定事件处理程序,首先必须取得一个要操作的对象的引用。

        每个元素(包括window和document)都有自己的事件处理属性,这些属性通常全部小写,如onclick。将这种属性设置成函数就可以指定事件处理程序:

 btn = document.getElementById("myBtn"= "Clicked!"

//HTML事件处理程序

 2. DOM2级事件模型

        在这种模型中,分为三个过程:事件捕获阶段、处于目标阶段7事件冒泡阶段;

  • 事件捕获阶段(capturing phase)。事件从document一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。

  • 事件处理阶段(target phase)。事件到达目标元素, 触发目标元素的监听函数。

  • 事件冒泡阶段(bubbling phase)。事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。

        DOM2级定义了两个方法,用于处理指定和删除事件处理程序的操作,addEventListener()和removeEventListener()。所有DOM节点都包含这两个方法,并且有三个参数,要处理的事件名、作为事件处理程序的函数和一个布尔值。要在click事件添加事件处理程序,可以用:

var btn = document.getElementById("myBtn");
btn.addEventListener("click", functioin() {
    alert(this.id);
}, false);
btn.addEventListener("click", function() {
    alert("Hello Kid");
}, false);

        此时执行顺序是顺序执行:"myBtn"  "Hello kid"。IE中的话执行顺序正好相反。

        移除事件监听函数的方式如下:

var btn = document.getElementById("myBtn");var handler = function() {
    alert(this.id);
};
"click", handler, btn.removeEventListener("click", handler, );

        这里只能用函数表达式的形式作为事件处理程序,因为removeEventListener()移除的时候要求传入的参数与添加应用程序时使用的参数相同。而通过匿名函数添加的事件监听函数将无法被移除。

3. IE中的事件模型

        IE中使用与DOM中类似的两个方法:attachEvent()和detachEvent()。这两个方法接受相同的两个参数,事件处理程序名称和事件处理程序函数。由于IE8及更早的版本只支持事件冒泡,所以通过attachEvent()添加的事件处理程序都会被添加到冒泡阶段。如果使用attachEvent()为按钮添加一个事件处理程序可用:

Android编程之虚拟机Dalvik教程 pdf版
Android编程之虚拟机Dalvik教程 pdf版

Android编程之虚拟机Dalvik教程 pdf,介绍Dalvik与标准Java虚拟机的差别以及运行环境的区别、以及Dalvik的形势前景分析、Android中各种Java包的功能描述、相关文件类型、应用程序结构分析、Android Adb工具介绍等,这些知识对即将从事Android编程的初级朋友来说,是一个完美的前奏曲。

下载

var btn = document.getElementById("myBtn");var handler = function() {
    alert(this.id);
};
btn.attachEvent("onclick", handler);//添加事件处理程序btn.detachEvent("onclick", handler);//删除事件处理程序

4. 事件对象

DOM中的事件对象

  • type表示被触发的事件类型

  • target表示事件的目标

  • currentTarget表示事件处理程序当前正在处理事件的那个元素

  • cancelable (Boolean) 表明是否可以取消事件的默认行为

  • bubbles (Boolean)表明事件是否冒泡

  • perventDefault()取消事件的默认行为。如果cancelable为true,则可以使用这个方法

  • stopPropagation()取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法。

IE中的事件对象

  • type表示被触发的事件类型

  • srcElement表示事件的目标

  • cancelBubble (Boolean)默认是false,将其设为true就可以取消事件冒泡

  • returnValue (Boolean) 默认是true,将其设置为false就可以取消事件的默认行为

        有了上面的事件对象,就可以写出跨浏览器的事件对象封装成事件包裹了。

var EventUtil = {
    addHandler: function(element, type, handler){        
    if (element.addEventListener){
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent){
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    },

    removeHandler: function(element, type, handler){        
    if (element.removeEventListener){                 //DOM2
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent){                  //IE
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;                  //DOM0        }
    },

    getEvent: function(event){        
    return event ? event : window.event;
    },

    getTarget: function(event){        
    return event.target || event.srcElement;
    },

    preventDefault: function(event){        
    if (event.preventDefault){
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    stopPropagation: function(event){        
    if (event.stopPropagation){
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }};

 以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

通过node.js来调取baidu-aip-SDK实现身份证识别的功能

如何把js变量值传到php

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
node.js调试
node.js调试

node.js调试可以使用console.log()输出调试信息、断点调试和第三方调试工具。详细介绍:1、console.log()输出调试信息,通过在代码中插入console.log()语句,开发人员可以在控制台输出变量的值、函数的执行结果等信息,以便观察代码的执行流程和状态;2、断点调试,可以在代码中设置断点,以便在特定位置暂停代码的执行,观察变量的值和执行流程等。

348

2023.09.19

JavaScript 全栈开发基础(Node.js + 前端)
JavaScript 全栈开发基础(Node.js + 前端)

本专题系统介绍 JavaScript 在全栈开发中的核心知识结构,涵盖 Node.js 基础、Express/Koa 接口构建、前端交互设计、模块化与包管理、数据库连接、前后端数据通信与部署流程。通过完整项目示例,帮助学习者掌握从浏览器到服务器的一体化开发能力,实现真正意义上的全栈入门。

101

2025.11.26

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

350

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

29

2025.11.30

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

513

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5306

2023.08.17

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号