JS:Html事件处理程序 vs DOM0级事件处理程序 vs DOM2级事件处理程序

1.HTML事件处理程序

某个元素支持的某种事件,可以通过一个与相应事件处理程序同名的HTML特性指定。这个特性的值应该是能够执行的JS代码。例如:按钮单击是要执行一些js代码,可以像下面:

<input type="button" value="click me" onclick="showMessage()" />

在js中就可以像下面一样处理:

<script>

function showMessage(){

alert("hello function");

alert(this == window) // true

}

</script>

此时showMessage中的this指向的window,但是showMessage函数可以被多个元素同时调用。

但是此方法有的缺陷就是js和html耦合在一起,如果要更换事件处理程序,需要改html和js两个地方。所以很多人喜欢用dom事件处理程序。

2. DOM0级事件处理程序

通过js指定事件处理程序的方式,就是将一个函数赋值给一个事件处理程序的属性。

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

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        btn2.onclick = function(){
            console.log(this);
        }
        </script>
    </body>
</html>

上面的this输出的结果是:<input type="button" value="click me2" id="btn2">,说明dom0级事件处理程序中的this指向的是当前元素本身,而不是windows,通过this可以访问元素的任何属性和任何方法。

3.DOM2级事件处理程序

DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener().所有的DOM节点都包含这两个方法,并且接受3个参数,要处理的事件名,作为事件处理程序的函数和一个布尔值。最后一个布尔值如果是true,则表示在捕获阶段,是false则表示在冒泡阶段。

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        //addEventListener接受3个参数:要处理的事件名,作为事件处理程序的函数和一个布尔值。最后一个布尔值如果是true,则表示在捕获阶段,是false则表示在冒泡阶段
        btn2.addEventListener(‘click‘,function(){
            console.log(this);
        }, false);
        </script>
    </body>
</html>

上面代码输出的结果和dom0级代码输出的结果一样:<input type="button" value="click me2" id="btn2">,说明dom2级事件处理程序中的this指向的是当前元素本身,而不是windows。

注意:addEventListener()方法只能通过removeEventListener()方法来移除。

但是使用removeEventListener()方法移除事件的时候需要注意的一点:

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        btn2.addEventListener(‘click‘,function(){
            console.log(this);
        }, false);
        btn2.removeEventListener(‘click‘,function(){//没有用
            console.log(this);
        }, false);
        </script>
    </body>
</html>

上面的方法移除click事件是没有用的,为什么呢?因为addEventListener和removeEventListener的第二个参数需要同一个函数,而上面的代码看似是同一个函数,其实不然,它们是功能相同的,但是是不同的匿名函数。如果需要正真移除事件处理程序,需要向下面这样:

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        var handler = function(){
            console.log(this);
        }
        btn2.addEventListener(‘click‘, handler, false);
        btn2.removeEventListener(‘click‘,handler, false);
        </script>
    </body>
</html>

像上面一样,就可以保证addEventListener和removeEventListener的第二个参数是同一个函数。

attachEvent()与detachEvent()

在早期的IE浏览器,如:IE8中,没有实现addEventListener()removeEventListener(),但提供了两个替代方法attachEvent()detachEvent()。由于Microsoft当前最新的系统Windows 10中,已放弃IEedge浏览器替代,所在attachEvent()detachEvent()已没有意义。

上面的内容基本上是从《JavaScript高级程序设计》摘抄,在加上自己的一些理解。如果有错误,欢迎指正。

时间: 2024-12-28 09:53:53

JS:Html事件处理程序 vs DOM0级事件处理程序 vs DOM2级事件处理程序的相关文章

DOM0、DOM2级事件

JavaScript DOM0.DOM2级事件 1.DOM0级事件:on+事件类型 在html行内直接绑定,也就是通过行内js绑定的例如<span onclick="alert('1')">第一项</span> 在js中绑定例如://<span onclick="alert('2')">第一项</span> var Ospan=document.getElementsByTagName('span')[0];Ospan

IE中DOM0级事件处理程序跟DOM2级事件处理程序中作用域(this)的区别

一:在布局中直接添加事件处理 <div id="div1" onclick="fOne();"></div> <script> var oDiv1 = document.getElementById("div1"); function fOne(){ alert(this===window);//true } </script> 弹出true,是因为在布局中调用的时候省略了window,全面的应该是

DOM0级事件处理和DOM2级事件处理

转自:http://www.cnblogs.com/holyson/p/3914406.html 0级DOM 分为2个:一是在标签内写onclick事件  二是在JS写onlicke=function(){}函数 1) <input id="myButton" type="button" value="Press Me" onclick="alert('thanks');" > 2) document.getEle

【20190226】JavaScript-知识点记录:dom0级事件,dom2级事件

DOM0级事件处理程序: 通过将元素的事件处理程序属性(如onclick)的值设置为一个函数来指定事件处理程序的方法称为DOM0级方法,它被认为是元素的方法,这时候的事件处理程序是在元素的作用域中运行(也就是this引用当前元素): 1 var btn = document.getElementById('myBtn'); 2 btn.onclick = function(){ 3 alert(this.id); 4 }; DOM2级事件处理程序: 通过addEventListener()方法和

Dom0级事件和Dom2级事件

1.Dom0级事件: 注册obj.onclick=function () {}; (1.使用简单,2.跨浏览器): 删除obj.onclick=null; 2.Dom2级事件(比0级优点:多个处理函数不会被覆盖): 成员 -> addEventListener注册事件   removeEventListener移出事件: 三个参数 -> 1事件名(都不能带on),2处理函数,3布尔值涉及嵌套元素的事件触发顺序(true按捕获流的顺序调用,false按事件冒泡流的顺序调用): (IE下用atta

DOM0,DOM2,DOM3事件

事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM1的信息啊,); DOM0就是直接通过 onclick写在html里面的事件, 比如: <input onclick="alert(1)" /> DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定; DOM3是一些

DOM0,DOM2,DOM3事件,事件基础知识入门

事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM1的信息啊,); DOM0就是直接通过 onclick写在html里面的事件, 比如: <input onclick="alert(1)" /> DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定; DOM3是一些

DOM2级事件addEventListener

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

关于DOM2级事件的事件捕获和事件冒泡

DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是从window元素开始,有的浏览器是从document开始,至于其中的差别我稍后会更新)开始,逐次进入dom内部,最后到达目标元素,依次执行绑定在其上的事件②.处于目标阶段,检测机制到达目标元素,按事件注册顺序执行绑定在目标元素上的事件.③.事件冒泡阶段,从目标元素出发,向外层元素冒泡,最后到达顶层