DOM 事件处理

HTML DOM 使 JavaScript 有能力对 HTML 事件做出反应。

事件绑定

我们可以在事件发生时执行 JavaScript,在事件发生之前,我们需要指定事件的响应函数(也就是告诉计算机,当某件事发生时,需要执行哪些代码);这个指定过程就是事件绑定。

元素事件属性

我们可以通过配置HTML元素属性 onXXXX 绑定事件发生时执行的代码,比如 onClick

<div onclick="this.innerHTML='谢谢!'">请点击该文本</div>

当事件发生时,需要执行很多行代码时,我们可以绑定函数:

<!DOCTYPE html>
<html>
<head>
  <script>
    function changetext(element){
      element.innerHTML="谢谢!";
    }
  </script>
</head>
<body>
  <h1 onclick="changetext(this)">请点击该文本</h1>
</body>
</html>

注意:changetext 的参数 this 是浏览器在事件发生时传入的函数的参数,其指向当前元素。

使用 DOM 指定事件响应函数

除了配置元素属性外,我们还可以使用 DOM 来动态的指定事件响应函数

<!DOCTYPE html>
<html>
<head>
</head>
<body>

  <p>点击按钮就可以执行 <em>displayDate()</em> 函数。</p>

  <button id="myBtn">点击这里</button>

  <script>
  document.getElementById("myBtn").onclick = displayDate;

  function displayDate()
  {
    document.getElementById("demo").innerHTML = Date();
  }
  </script>

  <p id="demo"></p>

</body>
</html>

在上面的例子中,名为 displayDate 的函数被分配给 id=myButn" 的 HTML 元素。

当按钮被点击时,会执行该函数。

使用 DOM 指定事件可以处理灵活多变的需求,但是会增加程序复杂度。实际中需要根据实际情况判断是否采用。

使用 addEventListener() 指定事件响应函数

思考这样一个问题:

<!DOCTYPE html>
<html>
<head>
</head>
<body>

  <p>点击按钮就可以执行 <em>displayDate()</em> 函数。</p>

  <button id="myBtn">点击这里</button>

  <script>
  document.getElementById("myBtn").onclick = displayDate;

  function displayDate()
  {
    document.getElementById("demo").innerHTML = Date();
  }

  // 这里有很多代码
  // 项目多人写完成,这里的代码有可能是别人写的

  document.getElementById("myBtn").onclick = other;
  function other()
  {
    alert("other code")
  }
  </script>

  <p id="demo"></p>

</body>
</html>

当我再点击按钮时,会显示当前时间吗?

在大型项目中,我们通常使用 addEventListener 给元素添加属性从而避免以上的问题。

addEventListener() 方法用于向指定元素添加事件句柄。

我们可以通过以下方法,为 <button> 元素添加点击事件

document.getElementById("myBtn").addEventListener("click", function(){
  document.getElementById("demo").innerHTML = "Hello World";
});

当我们需要给一个元素添加多个事件时,可以继续添加:

document.getElementById("myBtn").addEventListener("click", function(){
  alert("other code")
});

以下是 addEventListener 的参数说明

参数 描述
event 必须。字符串,指定事件名。 注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。 提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册。
function 必须。指定要事件触发时执行的函数。 当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。
useCapture 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。 可能值: true - 事件句柄在捕获阶段执行 false- false- 默认。事件句柄在冒泡阶段执行

对于 addEventListener 添加的事件,我们可以使用 removeEventListener 删除事件绑定

// 添加事件绑定
document.getElementById("myDIV").addEventListener("mousemove", myFunction);
// 删除事件绑定
document.getElementById("myDIV").removeEventListener("mousemove", myFunction);

事件对象

有的时候我们还需要获得当前事件的具体信息,这时候我们可以获取事件对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

在上面的例子中,我们只有稍加修改即可获得事件对象。

<!DOCTYPE html>
<html>
<head>
</head>
<body>

  <p>点击按钮就可以执行 <em>displayDate()</em> 函数。</p>

  <button id="myBtn">点击这里</button>

  <script>
  document.getElementById("myBtn").onclick = displayDate;

  // 这里的 event 会由系统自动构建并传入
  function displayDate(event)
  {
    console.log(event)
    document.getElementById("demo").innerHTML = Date();
  }
  </script>

  <p id="demo"></p>

</body>
</html>

完整的事件对象属性可以参考这里

DOM 事件列表

当然,除了绑定 click 事件,我们还可以绑定其他事件,如:

  • 当用户点击鼠标时
  • 当网页已加载时
  • 当图像已加载时
  • 当鼠标移动到元素上时
  • 当输入字段被改变时
  • 当提交 HTML 表单时
  • 当用户触发按键时

完整的事件列表可以参考这里

实战 Tabs

我们可以使用 DOM 相关操作实现一个标签页切换效果

results matching ""

    No results matching ""