JavaScript-StepPitGuide
  • 封面
  • 前言
  • 基础知识
    • 基础知识
      • 变量声明
      • 变量类型和计算
      • 作用域
      • 基本数据类型
        • Undefined
        • Null
        • Boolean
        • Number
        • String
        • Symbol
      • 类型转换
    • 引用类型
      • Object类型
      • Array类型
        • 检测数组
        • 转换方法
        • 栈方法
        • 队列方法
        • 重排序方法
        • 操作方法
        • 位置方法
        • 迭代方法
        • 归并方法
      • Date类型
      • RexExp类型
      • Function类型
      • Set类型(ES6)
      • Map类型(ES6)
    • BOM
      • window对象
      • location对象
      • navigator对象
      • screen对象
      • history对象
    • DOM
      • DOM节点操作
      • DOM结构操作
    • 事件
      • 事件流
      • 事件注册与触发
      • 事件对象
      • 事件分类
    • 异步
      • Ajax
      • Promise
    • 正则表达式
    • 面向对象程序设计
      • 构造函数
      • 原型链
      • 继承
      • New
      • Object.create
    • 函数表达式与函数式编程
      • 递归
      • 闭包
      • this
      • 箭头函数
      • 高阶函数
      • 由函数构建函数
      • 纯度、不变性和更改政策
      • 基于流的编程
      • 无类编程
      • 函数基本应用
    • 语法规则
      • ESlint
  • 进阶知识
    • 算法应用
      • 基本排序算法
        • 冒泡排序
        • 选择排序
        • 插入排序
        • 希尔排序
        • 归并排序
        • 快速排序
    • 模块化
      • AMD
      • CommonJS
      • ES6模块化
    • 应用
      • Socket.io库
      • async+await异步调用
      • axios
    • 设计模式
    • 性能优化
    • 工具
      • 时间操作
    • 异常监控
    • 安全🔐
      • XSS
      • CSRF
    • 跨域
      • 跨域
      • 跨域方法
        • Hash
        • JSONP
        • CORS
        • XDomainRequest
由 GitBook 提供支持
在本页
  • DOM事件介绍
  • 编写一个通用的事件监听函数

这有帮助吗?

  1. 基础知识

事件

DOM事件介绍

  • 点击一个DOM元素

  • 键盘按一下一个键

  • 输入框输入内容

  • 页面加载完成

编写一个通用的事件监听函数

描述事件冒泡流程

  • DOM树形结构

  • 事件冒泡

  • 阻止冒泡

  • 冒泡的应用

对于一个无限下拉加载图片的页面,如何给每个图片绑定事件

  • 使用代理

  • 知道代理的有点

通用事件绑定

var btn = document.getElementById('btn1');
btn.addEventListener('click',function (event) {
  console.log('clicked');
})

function bindEvent(elem,type,fn) {
  elem.addEventListener(type,fn);
}
var a = document.getElementById('link1')
bindEvent(a,'click',function(e){
  e.preventDefault(); //阻止默认行为
  alert('clicked');
});

事件冒泡

<body>
  <div id="div1">
    <p id="p1">激活</p>
    <p id="p2">取消</p>
    <p id="p3">取消</p>
    <p id="p4">取消</p>
  </div>
  <div id="div2">
    <p id="p5">取消</p>
    <p id="p6">取消</p>
  </div>
</body>
var p1 = document.getElementById('p1');
var body = document.body;
bindEvent(p1,'click',function (e) {
  e.stopPropatation();
  alert('激活');
});
bindEvent(body,'click',function(e){
  alert('取消');
})

代理

<div id="div1">
  <a href="#">a1</a>
  <a href="#">a2</a>
  <a href="#">a3</a>
  <a href="#">a4</a>
  <!-- 会随时新增更多a标签 -->
</div>
var div1 = document.getElementById('div1');
div1.addEventListener('click',function (e) {
  var target = e.target;
  if (target.nodeName === 'A') {
    alert(target.innerHTML);
  }
})

完善通用绑定事件的函数

//使用代理
var div1 = document.getElementById('div1');
bindEvent(div1,'click','a',function (e) {
  console.log(this.innerHTML);
})
function bindEvent(elem,type,selector,fn) {
  if (fn == null) {
    fn = selector;
  }
  elem.addEventListener(type,function (e) {
    var target;
    if (selector) {
      target = e.target;
      if (target.matches(selector)) {
        fn.call(target,e);
      }
    }else {
      fn(e);
    }
  })
}
上一页DOM结构操作下一页事件流

最后更新于3年前

这有帮助吗?