JS事件机制

简介: javascript中有两种事件模型:DOM0,DOM2。而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些。DOM0级事件模型DOM0级事件模型是早期的事件模型,所有的浏览器都是支持的,而且其实现也是比较简单。

javascript中有两种事件模型:DOM0,DOM2。而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些。

DOM0级事件模型

DOM0级事件模型是早期的事件模型,所有的浏览器都是支持的,而且其实现也是比较简单。代码如下:

<p id = 'click'>click me</p>
<script>
    document.getElementById('click').onclick = function(event){
        alert(event.target);
    }
</script>

这种事件模型就是直接在dom对象上注册事件名称,这段代码就是在p标签上注册了一个onclick事件,在这个事件函数内部输出点击的目标。而解除事件则更加简单,就是将null复制给事件函数,如下:

document.getElementById('click'_).onclick = null;

由此我们可以知道dom0中,一个dom对象只能注册一个同类型的函数,因为注册多个同类型的函数的话,就会发生覆盖,之前注册的函数就会无效。

var click = document.getElementById('click');
click.onclick = function(){
    alert('you click the first function');
};
click.onclick = function(){
    alert('you click the second function')
}

在这段代码中,我们为dom对象注册了两个onclick函数,但是结果是只执行了第二个注册的函数,前面所注册的函数被覆盖了。

DOM2级事件模型

事件捕获和事件冒泡(capture,bubble)

首先,IE8及以下是不支持这种事件模型的。事件捕获和事件冒泡的机制如下图:
image
如上图所示,123代表事件捕获,4567代表事件冒泡。

DOM2级的注册事件和解除事件

在DOM2级中使用addEventListener和removeEventListener来注册和解除事件(IE8及之前版本不支持)。这种函数较之之前的方法好处是一个dom对象可以注册多个相同类型的事件,不会发生事件的覆盖,会依次的执行各个事件函数。

<html>
    <head>
        <meta charset="utf-8">
    </head>
    
    <body>
        <div id = 'outer' style = 'margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;'>
            <div id="inner" style = 'margin-left:20px; width: 50px;height:50px; background: green;'></div>
        </div>
    </body>
    
    <script>
        /*var click = document.getElementById('inner');
        click.addEventListener('click',function(){
            alert('click inner one');
        },false);
        
        click.addEventListener('click',function(){
            alert('click inner two');
        },false);
        
        document.getElementById('outer').addEventListener('click',function(){
            alert('click outer');
        },false);
        
        document.addEventListener('click',function(){
            alert('click document');
        },false);
        
        document.getElementsByTagName("html")[0].addEventListener('click',function(){
            alert('click html');
        },false);*/
        
        
        
        
        
        /*var click = document.getElementById('inner');
        click.addEventListener('click',function(){
            alert('click inner one');
        },true);
        
        click.addEventListener('click',function(){
            alert('click inner two');
        },true);
        
        document.getElementById('outer').addEventListener('click',function(){
            alert('click outer');
        },true);
        
        document.addEventListener('click',function(){
            alert('click document');
        },true);
        
        document.getElementsByTagName("html")[0].addEventListener('click',function(){
            alert('click html');
        },true);*/
        
        /*document.addEventListener('click',function(event){
            alert('click document');
            //event.stopPropagation();
        },true);
        
        document.getElementsByTagName("html")[0].addEventListener('click',function(event){
            alert('click html');
            event.stopPropagation();
        },true);
        
        document.getElementById('outer').addEventListener('click',function(event){
            alert('click outer');
            //event.stopPropagation();
        },true);
        
        var click = document.getElementById('inner');
        click.addEventListener('click',function(event){
            alert('click inner one');
            //event.stopPropagation();
        },true);
        
        click.addEventListener('click',function(event){
            alert('click inner two');
            //event.stopPropagation();
        },true);*/
        
        //冒泡事件
        document.addEventListener('click',function(event){
            alert('click document pop');
            event.stopPropagation();
        },false);
        
        document.getElementsByTagName("html")[0].addEventListener('click',function(event){
            alert('click html pop');
            event.stopPropagation();
        },false);
        
        document.getElementById('outer').addEventListener('click',function(event){
            alert('click outer pop');
            //event.stopPropagation();
        },false);
        
        var click = document.getElementById('inner');
        click.addEventListener('click',function(event){
            alert('click inner one pop');
            event.stopPropagation();
        },false);
        
        click.addEventListener('click',function(event){
            alert('click inner two pop');
            event.stopPropagation();
        },false);
        
        
    </script>
</html>
相关文章
|
18天前
|
JavaScript 前端开发
js开发:请解释事件冒泡和事件捕获。
JavaScript中的事件处理有冒泡和捕获两种方式。事件冒泡是从子元素向上级元素传递,而事件捕获则从外层元素向内层传递。`addEventListener`的第三个参数可设定事件模式,`false`或不设为冒泡,`true`为捕获。示例代码展示了如何设置。
24 2
|
1天前
|
消息中间件 存储 前端开发
理解JavaScript事件循环机制
理解JavaScript事件循环机制
7 1
|
2天前
|
前端开发 JavaScript UED
JavaScript 的事件循环机制是其非阻塞 I/O 模型的核心
JavaScript的事件循环机制是其非阻塞I/O的关键,通过单线程的调用栈和任务队列处理异步任务。当调用栈空时,事件循环从任务队列取出一个任务执行,形成循环。异步操作完成后,回调函数进入任务队列,等待被事件循环处理。微任务如Promise回调在每个宏任务结束后执行。此机制确保JavaScript能高效处理异步操作,不阻塞主线程,提供流畅的用户体验。
6 2
|
4天前
|
JavaScript 前端开发 开发者
javascript事件大全
javascript事件大全
|
4天前
|
JavaScript 前端开发
Javascript的一些监听事件
Javascript的一些监听事件
10 2
|
4天前
|
JavaScript 前端开发
js的事件介绍
js的事件介绍
10 1
|
4天前
|
JavaScript 前端开发
js的事件
js的事件
10 1
|
4天前
|
JavaScript 前端开发
js的交互事件
js的交互事件
11 1
|
8天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
10天前
|
JavaScript 前端开发 开发者
【JavaScript技术专栏】JavaScript事件处理机制详解
【4月更文挑战第30天】本文探讨JavaScript中的事件处理机制,涉及事件类型(如click、mouseover)、事件流(冒泡型、捕获型及目标阶段)、事件处理函数(内联与addEventListener方法)以及事件委托(用于优化内存和处理动态元素)。此外,还介绍了事件取消,通过`preventDefault()`和`stopPropagation()`控制事件行为。理解这些概念对构建交互式Web应用至关重要。