javascript之事件详解

绑定事件处理
1.ele.onxxxx = function() {}
兼容性很好,但是一个元素上同一事件只能绑定一次处理函数
等同于写在HTML的行间上
this指向dom

2.ele.addEventListener(type, fn, false)
IE9以下不兼容,可以在一个事件上绑定多个处理函数
this指向dom

3.ele.attachEvent('on' + type, fn)
IE独有,一个事件可以绑定多个处理函数
this指向window

封装兼容性的addEvent(elem, type, handle)

function addEvent(elem, type, handle) {
  if(elem.addEventListener) {
    elem.addEventListener(type, handle, false)
  }else if(elem.attachEvent) {
    elem.attachEvent('on' + type, function() {
      handle.call(elem)
    })
  }else {
    elem['on' + type] = handle
  }
}

解除事件绑定
1.elem.onxxx = false/''/null

2.elem.removeEventListener(type, fn, false)

3.elem.detachEvent('on' + type, fn)

若绑定匿名函数无法解除

事件处理模型
1.冒泡
结构上(非视觉上),同一事件,子元素会冒泡向父元素(自底向上)

2.捕获
结构上(非视觉上),同一事件,父元素会捕获向子元素(事件源元素)(自上向底)
ele.addEventListener(type, fn, true)

IE上没有捕获

触发顺序,先捕获,后冒泡,同一事件源按注册顺序来

focus blur change submit reset select等事件不能冒泡

取消冒泡和阻止默认事件

取消冒泡
W3C标准 event.stopPropagation(),但不支持IE9以下
IE独有 event.cancelBubble = true
封装取消冒泡函数 stopBubble(event)

function stopBubble(event) {
  if(event.stopPropagation) {
    event.stopPropagation()
  }else {
    event.cancelBubble = true    
  }
}

阻止默认事件
默认事件--表单提交,a标签跳转,右键菜单等
1.return false; 以对象属性的方式注册的事件才生效
2.event.preventDefault(); W3C标准,IE9以下不兼容
3.event.returnValue = false; 兼容IE
封装阻止默认事件函数 cancelHandler(event)

function cancelHandler(event) {
  if(event.preventDefault) {
    event.preventDefault();
  }else {
    event.returnValue = false
  }
}

事件源对象
event || window.event 用于IE
事件源对象
event.target 火狐只有这个
event.srcElement IE只有这个
这俩chrome都有

兼容性写法
var event = event || window.event
var target = event.target || event.srcElement

事件委托
利用事件冒泡,和事件源对象进行处理
优点
1.性能。不需要循环所有的元素进行一个一个绑定事件
2.灵活。当有新的子元素时不需要重新绑定事件

请看下面例子

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
</ul>
<script type="text/javascript">
  var ul = document.getElementsByTagName('ul')[0]
  ul.onclick = function(e) {
    var event = event || window.event
    var target = event.target || event.srcElement
    console.log(target.innerText)
  }
  //即点击li是会事件冒泡到ul上,处理ul的点击事件,来获得li的内容,这样就是事件委托
</script>

事件分类
click, mousedown, mousemove, mouseup, contextmenu, mouseover, mouseout, mouseenter, mouseleave(H5标准)
用button来区分鼠标的按键 0/1/2
e.button == 2 'right' e.button == 0 'left'
DOM3标准规定:click事件只能监听左键,只能通过mousedown和mouseup来判断鼠标按键
如何解决click和mousedown点击冲突 (设置mousedown和mouseup之间的时间差来区分click)

键盘事件
onkeypress onkeydown onkeyup
keydown > keypress > keyup
keydown和keypress区别
keydown可以响应任何键盘按键,keypress只可响应字符类键盘按键
keypress返回Ascall码,可以转换相应字符

文本类事件
input focus blur

事件分类
窗体操作类(windows上的事件)
scroll load(无意义)

end !!!

原文地址:https://www.cnblogs.com/lyjfight/p/13830418.html