JavaScript 基础-事件处理

194 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

DOM 事件

什么是事件?

事件就是一件事情或者一个行为(对于元素来说,它的很多事件都是天生自带的),只要我们去操作这个元素,就会触发这些行为 “事件就是元素天生自带的行为,我们操作元素,就会触发相关的事件行为”

事件绑定:给元素天生自带的事件行为绑定方法,当事件触发,会把对应的方法执行

oBox.onclick=function(){}

元素天生自带的事件?

鼠标事件

click:点击 (PC 端是点击,移动端的 click 代表单击[移动端使用 click 会有 300MS 延迟的问题]) dblclick:双击 mouseover:鼠标经过 mouseout:鼠标移出 mouseenter:鼠标进入 mouseleave:鼠标离开 mousemove:鼠标移动 mousedown:鼠标按下(鼠标左右键都起作用,它是按下即触发,click 是按下抬起才会触发,而且是先把 down 和 up 触发,才会触发 click) mouseup:鼠标抬起 mousewheel:鼠标滚轮滚动 ...

键盘事件

keydown:键盘按下 keyup:键盘抬起 keypress:和 keydown 类似,只不过 keydown 返回的是键盘码,keypress 返回的是 ASCII 码值 input:由于 PC 端有实体物理键盘,可以监听到键盘的按下和抬起,但是移动端是虚拟的键盘,所以 keydown 和 keyup 在大部分手机上都没有,我们使用 input 事件统一代替他们(内容改变事件) ...

表单元素常用的事件

focus:获取焦点 blur:失去焦点 change:内容改变 ...

其它常用事件

load:加载完成 unload beforeunload scroll:滚动条滚动事件 resize:大小改变事件 window.onresize=function(){} 当浏览器窗口大小发生改变,会触发这个事件,执行对应的事情 ...

移动端手指事件

touch:单手指操作

touchstart:手指按下 touchmove:手指移动 touchend:手指离开 touchcancel:因为意外情况导致手指操作取消 [gesture:多手指操作] gesturestart:手指按下 gesturechange:手指改变 gestureend:手指离开 ...

H5 中的 AUDIO/VIDEO 音视频事件

canplay:可以播放(播放过程中可能出现由于资源没有加载完成,导致的卡顿) canplaythrough:资源加载完成,可以正常无障碍播放 ...

box.onclick = function () {
  console.log("click");
};
box.onmousedown = function () {
  console.log("down");
};
box.onmouseup = function () {
  console.log("up");
};
tempInp.onkeydown = function () {
  console.log("ok");
};

事件绑定

DOM0 级事件绑定

[element].onxxx=function(){}

DOM2 级事件绑定

[element].addEventListener('xxx',function(){},false); [element].attachEvent('onxxx',function(){}); [IE6~8]

目的

给当前元素的某个事件绑定方法(不管是基于 DOM0 还是 DOM2),都是为了触发元素的相关行为的时候,能做点事情(也就是把绑定的方法执行);“不仅把方法执行了,而且浏览器还给方法传递了一个实参信息值 ==>这个值就是事件对象”

<div id="box"></div>

事件的默认

事件本身就是天生就有的,某些事件触发,即使你没有绑定方法,也会存在一些效果,这些默认的效果就是"事件的默认行为"

A 标签的默认行为

页面跳转

<a href="http://www.baidu.cn/" target="_blank">
  百度
</a>
// target='_blank':让其在新窗口打开

锚点定位(HASH 定位[哈希定位])

首先会在当前页面 URL 地址栏末尾设置一个 HASH 值,浏览器检测到 HASH 值后,会默认定位到当前页面中 ID 和 HASH 相同的盒子的位置(基于 HASH 值我们还可以实现 SPA 单页面应用)

<a href="#box">百度</a>

INPUT 标签

  1. 输入内容可以呈现到文本框中
  2. 输入内容的时候会把之前输入的一些信息呈现出来(并不是所有浏览器和所有情况下都有)

SUBMIT 按钮也存在默认行为

点击按钮页面会刷新

在 FORM 中设置 ACTION,点击 SUBMIT,会默认按照 ACTION 指定的地址进行页面跳转,并且把表单中的信息传递过去(非前后端分离项目中,由服务器进行页面渲染,由其它语言实现数据交互,一般都是这样处理)

<form action="http://www.baidu.cn/">
    <input type="submit" value="提交">
</form>

如何阻止默认行为

阻止 A 标签的默认行为:很多时候我们使用 A 标签仅仅是想当做一个普通的按钮,点击实现一个功能,不想页面跳转,也不想锚点定位

在结构中阻止

javascript:void 0/undefined/null...

<a href="javascript:;">百度</a>

在 JS 中也可以阻止

给其 CLICK 事件绑定方法,当我们点击 A 标签的时候,先触发 CLICK 事件,其次才会执行自己的默认行为

link.onclick = function (ev) {
  ev = ev || window.event;
  return false;
};
tempInp.onkeydown = function (ev) {
  ev = ev || window.event;
  ev.preventDefault ? ev.preventDefault() : (ev.returnValue = false);
  return false;
};
tempInp.onkeydown = function (ev) {
  ev = ev || window.event;

  let val = this.value.trim(), //=>TRIM 去除字符串首位空格(不兼容) this.value=this.value.replace(/^ +| +$/g,'')
    len = val.length;
  if (len >= 6) {
    this.value = val.substr(0, 6);

    //=>阻止默认行为去除特殊按键(DELETE\BACK-SPACE\方向键...)
    let code = ev.which || ev.keyCode;
    if (!/^(46|8|37|38|39|40)$/.test(code)) {
      ev.preventDefault ? ev.preventDefault() : (ev.returnValue = false);
    }
  }
};