用js写一个事件侦听器的方法

// 方法一:addEventListener (推荐)

// 获取要添加事件侦听器的元素
const element = document.getElementById("myElement"); // 或者其他选择器,例如:document.querySelector(".myClass")

// 添加事件侦听器
element.addEventListener("click", function(event) {
  // 处理点击事件的代码
  console.log("元素被点击了!");
  console.log(event); // event 对象包含有关事件的信息
});


// 可以添加多个事件侦听器到同一个元素上
element.addEventListener("mouseover", function() {
  console.log("鼠标悬停在元素上");
});


// 移除事件侦听器 (需要传入和添加时相同的函数)
function handleClick(event) {
  console.log("再次点击!");
}

element.addEventListener("click", handleClick);

// ...一段时间后...

element.removeEventListener("click", handleClick);



// 方法二:on<event> 属性 (不推荐,但有时会用到)

// 直接在 HTML 元素上设置
// <button id="myButton" onclick="handleClick()">点击我</button>

// 或者在 JavaScript 中设置
const myButton = document.getElementById("myButton");
myButton.onclick = function() {
  console.log("按钮被点击了!");
};

// 这种方法的缺点是,每个事件类型只能绑定一个处理函数。
// 新的处理函数会覆盖旧的。


// 方法三:attachEvent (IE8 及更早版本)

// 仅用于兼容非常老的 IE 浏览器
if (element.attachEvent) {
  element.attachEvent("onclick", function() {
    console.log("元素被点击了! (IE8)");
  });
}


//  一些额外的说明:

// 1. 事件对象 (event):  在事件处理函数中,可以访问 `event` 对象,它包含有关事件的信息,例如:
//    - event.target: 触发事件的元素
//    - event.type: 事件类型 (例如 "click", "mouseover")
//    - event.clientX/clientY: 鼠标指针的坐标


// 2. 事件冒泡和捕获:  事件在 DOM 树中传播的方式。可以使用第三个参数来控制是在捕获阶段还是冒泡阶段处理事件。
//    element.addEventListener("click", myFunction, true); // 捕获阶段
//    element.addEventListener("click", anotherFunction, false); // 冒泡阶段 (默认)


// 3.  preventDefault():  阻止事件的默认行为。例如,阻止链接的跳转。
element.addEventListener("click", function(event) {
  event.preventDefault();
  console.log("阻止了默认行为");
});


// 4. stopPropagation(): 阻止事件冒泡到父元素。
element.addEventListener("click", function(event) {
  event.stopPropagation();
  console.log("阻止了事件冒泡");
});

选择哪种方法?

强烈建议使用 addEventListener()。它更灵活,允许为同一事件添加多个处理程序,并且是标准的、跨浏览器兼容的方法。 避免使用 on<event> 属性,因为它不够灵活,容易被覆盖。 attachEvent() 仅用于兼容非常老的 IE 浏览器,现在几乎不再需要。

这个例子演示了如何使用 JavaScript 添加事件侦听器来处理各种事件。 选择最适合你需求的方法,并根据需要修改代码。 记住查阅文档以获取更多事件类型和 event 对象的属性。

posted @   王铁柱6  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示