js编程-DOM事件及事件委托(二)

84 阅读2分钟

事件对象

给当前元素的某个事件行为绑定方法,当事件行为触发,不仅会把绑定的方法执, 而且还会给方法默认传递一个实参,而这个实参就是事件对象。

let body = document.body;

/*
* 事件对象: 存储当前事件操作及触发的相关信息
*    (浏览器本身记录的,记录的是当前操作的信息,和在哪个函数中无关)
*   + 鼠标事件对象 MouseEvent 
*     + clientX/clientY 鼠标触发点距离窗口的X/Y坐标(不管当前触发点在第几屏)
*     + pageX/pageY  鼠标触发点距离BODY的X/Y坐标
*     + type 事件类型
*     + target/srcEmelent 获取当前事件源(当前操作的元素)
*     + path 传播路径
*     + preventDefault() 【在Event.prototype上(ie6、7、8不兼容)】 / returnValue = false 阻止事件的默认行为 
*     + ev.stopPropagation() / ev.cancleBuddle 阻止冒泡传播
*/
let n = null;
body.addEventListener('click', function (ev) {
  n = ev;
  console.log(ev, 0)
})

body.addEventListener('click', function (ev) {
  console.log(ev === n) // true
  console.log(ev, 1)
})
/*
* 键盘事件对象 KeyboardEvent
    + type 事件类型
    + key / code 存储键名称
    + preventDefault() 【在Event.prototype上(ie6、7、8不兼容)】 / returnValue = false 阻止事件的默认行为 
    + ev.stopPropagation() / ev.cancleBuddle 阻止冒泡传播
    + which/ keyCode 获取按键的键盘码 (MAC电脑上没有BackSpace delete是18)
      + 方向键 “左 37 上38 右 39 下40”
      + Space(空格) 32
      + BackSpace(回退) 8
      + Enter 13 
      + Del 46
      + Shift 16 
      + Ctrl 17
      + Alt 18
   + altKey 是否按下alt键(组合按键)
   + ctrlKey 是否按下ctrl键(组合按键)
   + shiftKey 是否按下shift键(组合按键)
   
*/
document.onkeydown = function(ev) {
  console.log(ev)
}
/*
* 手指事件对象 TouchEvent 
*   记录手指的信息,获取的结果都是TouchList集合,记录每一根手指的信息 
*   + changeTouches (常用) 手指按下、手指移动、离开屏幕都存储了对应的手指信息,
                    哪怕离开屏幕,存储的是最后依次手指在屏幕的的信息
*   + touches: 缺少手指离开屏幕的信息
*   + targetTouches 不常用
*   + ev.changeTouches 第一根手指的信息
      + clientX / clientY
      + pageX / pageY
      + ....
*/
document.onTouchStart = function (ev) {
  console.log(ev)
}
/*
* Event 普通事件对象
*/
window.onload = function (ev) {
  console.log(ev) //普通事件对象 
}

浏览器的默认行为: 浏览器会赋予元素很多默认的行为操作

  • 鼠标右击菜单;

  • 点击A标签实现页面的跳转

  • 部分浏览器会记录输入记录,在下次输入的时候有模糊匹配

  • 键盘按下会输入内容

  • ...

可以基于ev.preventDefault() 来阻止默认这些默认行为

window.onContextMenu = function (ev) {
  // 组织默认行为: 禁用自带的右键菜单
  ev.preventDefault();
}

A标签的默认行为:1)页面跳转; 2) 锚点定位(定位到当前页面中指定ID的位置,url地址中会加入HASH值)

// 方案一:
<a href='javascript:;' id='link'></a>
// 方案二:
<scritp>
   link.onclick = function (ev) {
     // 阻止默认行为
     ev.preventDefault();
     // 或者 return false
  }
</scritp>