事件

126 阅读3分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

事件

事件是什么?

所谓事件,就是浏览器告知JavaScript程序用户的行为。例如用户点击了HTML页面中的某个按钮, 或者用户输入用户名或密码等操作。

如下代码展示了鼠标点击按钮事件操作:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件是什么</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
    // 获取按钮元素
    var button = document.getElementById('btn');
    // 事件绑定
    button.onclick = function () {
        console.log('你终于点中我了... ...');
    }
</script>
</body>
</html>

事件操作解析图如下所示:

d9IQL8.png


事件类型

  • 事件根据使用的场景不同,可以分为如下几种:
  • 依赖于设备的输入事件:键盘事件和鼠标事件,这些事件都是直接和设备相关的。
  • 独立于设备的输入事件:例如click事件等,这些事件并没有直接与设备相关。
  • 用户界面的相关事件:用户界面事件属于较高级的事件,一般多用于表单中的组件。
  • 状态变化的相关事件:这些事件与用户行为无关,而是由网络或测览器触发的。
  • 特定API事件:这些事件多用于特定场景的实现,例如HTML5中提供的拖放API中的事件等。
  • 与错误处理的相关事件。

事件实现步骤

1、定位页面中指定的元素

2、未指定元素绑定事件 :具有一个事件监听器(监听用户相应的行为)

3、为绑定的事件编写相应的处理函数(用户触发相应的行为时,函数做出相应)

如下代码所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件实现步骤</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
    // 1、定位页面中指定的元素
    var button = document.getElementById('btn');
    // 2、未指定元素绑定事件 :具有一个事件监听器(监听用户相应的行为)
    button.onclick = function () {
        // 3、为绑定的事件编写相应的处理函数(用户触发相应的行为时,函数做出相应)
        console.log('你终于点中我了... ...');
    }
</script>
</body>
</html>

注册事件是什么

所谓注册事件,就是将JavaScript函数与指定的事件相关联,被绑定的函数成为该事件的句柄。当该事件被触发时,绑定的函数会被调用。

注册事件具有以下三种方式实现:

  • HTML页面元素提供的事件属性
  • DOM标准规范中HTML相关对象提供的事件属性
  • 通过向HTML页面中指定元素添加事件监听器

1、HTML页面元素提供的事件属性

缺点:没有将HTML结构与行为进行有效分离。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML页面元素提供的事件属性</title>
</head>
<body>
<button onclick="myClick()" id="btn">按钮</button>
<script>
    function myClick() {
        console.log('你终于点中我了...');
    }
</script>
</body>
</html>

代码分析:

dCaoQI.png

2、DOM对象提供的事件属性

通过DOM标准规范中的Document对象定位HTML页面的元素,所返回的DOM对象提供了一系列的事件属性,通过这些事件属性可以实现注册事件的功能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM对象提供的事件属性</title>
</head>
<body>
<button onclick="myClick()" id="btn">按钮</button>
<script>
    var btn = document.getElementById('btn');
    //DOM对象的事件属性
    btn.onclick = myClick;
    function myClick() {
        console.log('你终于点中我了...');
    }
</script>
</body>
</html>

通过DOM对象的事件属性方式注册事件,是不允许重复注册的。如果以这种方式为某个元素注册相同事件多次的话,只有最后一次注册的函数有效。

3、事件监听器

DOM标准规范提供的addEventlistener()方法,调用该方法表示向指定元素添加事件监听器。

element.addEventListener(exentName, functionName, capture)
参数名称描述
eventName为元素指定具体的事件名称(例如单击事件是click等)
funcationName注册事件的句柄
capture设置事件是捕获阶段还是冒泡阶段。false为默任值,表示冒泡阶段

addEventListener()方法是DOM的标准规范所提供的注册事件监听器的方法,它的优点包括以下几点:

  • 它允许某个HTML页面的元素在绑定一个事件的同时,注册多个事件的句柄(事件处理函数)。

  • 它提供了一种更精细的手段控制事件的触发阶段(是捕获阶段还是冒泡阶段)。

在E8及之前版本的浏览器,并不支持addEventListenter()方法添加事件监听器。而是使用 attachEvent()方法进行添加。

element.attachEvent(eventName, functionName)
  • eventName:为元素指定具体时间名称(例如单击事件是click等)
  • funcationName :注册事件的句柄

如下代码所示 DOM对象提供的事件属性 与 事件监听器的比较 以及浏览器的兼容问题和解决方案:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加事件监听器</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
    var btn = document.getElementById('btn');

    //1、DOM对象提供的事件属性  —— 无法同时为一个指定元素绑定相同事件多次
    btn.onclick = function(){
        console.log('xxx...');
    };//无输出值被修改为yyy
    btn.onclick = function(){
        console.log('yyy...');//输出yyy
    }

    /*
    2、添加事件监听器
        为指定元素添加事件监听器
        addEventListener(eventName,claaback)
       *参数:
            * eventName:表示绑定事件的名称(注意:没有on)
            * callback :表示事件的处理函数(回调函数)
        *允许为相同元素绑定相同事件多次
    */
    btn.addEventListener('click',function () {
        console.log('xxxx')//xxxx
    });
    btn.addEventListener('click',function () {
        console.log('yyyy')//yyyy
    });
    

    /*3、事件监听器的浏览器兼容问题(IE8以下版本浏览器不支持)
    attachEvent(eventName, functionName)方法
    *参数
        *eventName:表示绑定事件的名称(注意:必须有on)
        *functionName:表示事件的处理函数
    */
    btn.attachEvent('onclick',function () {
        console.log('xxxx')
    });

    // 4、提供浏览器兼容问题解决方案
    function bind(element,eventName,funcationName) {
        if (element.addEventListener){
            element.addEventListener(eventName,funcationName);
        }else{
            element.addEventListener('on' + eventName,funcationName);
        }
    }
</script>
</body>
</html>