javascript event,事件对象详解 1. 事件对象

1. 事件对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

  • 什么时候会产生Event 对象呢?
    • 例如: 当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象.
  • 事件通常与函数结合使用,函数不会在事件发生前被执行!

2. 事件流

2.1 事件流发展史

  • 事件发展史,这位大神已经写好了,想去偷瞄两眼的请点击这里

2.2 冒泡

  • 什么是事件冒泡,
    • 官方的定义就是从最特定的事件目标到最不特定的事件目标

意思就是说,假如用户单击了一个元素,该元素拥有一个click事件,那么同样的事件也将会被它的祖先触发,这个事件从该元素开始一直冒泡到DOM树的最上层,这一过程称为事件冒泡

2.3 捕获

  • 什么是事件捕获

事件捕获和事件是相反的,也就是说,当用户触发了一个事件的时候,这个事件是从DOM树的最上层开始触发一直到捕获到事件源.

2.4 事件流

  • 它的由来

由于微软和网景乱搞,后来必须要为事件传播机制,制定一个标准,因为事件捕获是网景公司开发出来的,而事件冒泡是由微软公司开发出来的,它们都想要自己的技术成为标准,所以导致这两个公司老是干架,制定标准的人为了不让它们干架,所以研发了事件流.

2.5 事件流的写法以及实现方式

  • 标准实现方式使用关键词addEventListener,假如你想要给某一个元素添加事件,现在就可以这样写element.addEventListener(eventType, fn, false)
    • dom对象.addEventListener(事件类型, 回调函数, 事件机制)这里的事件类型表示你要使用哪种事件类型比如click, 回调函数里面写着触发此事件你要做什么事情, 事件机制分为冒泡和捕获,如果为false表示事件冒泡,为true表示事件捕获
  • 既然有标准的实现方式,那么肯定也存在着不和谐的写法,没办法谁让人家牛逼呢,俗话说的好啊两虎之争必有一伤,可伤了我们程序员了.这种不和谐的写法是
    • dom对象.attachEvent(eventType, fn)第一个参数表示事件类型,第二个是回调.这种写法兼容IE, IE没有实现事件捕获,因为在当时他比较厉害,以为没必要…………只是,,,,省略一千字, 现在微软的浏览器已经做得很好了… 只是调侃一下无其他意图..
  • 以上的两种写法一种是兼容W3C标准的一种是老版IE的写法,怎么写兼容性写法呢?下面是注册事件和删除事件的Code
1.// 注册时间


2.if(dom.addEventListener) {


3. dom.addEventListener(eventType, fn);


4.} else {


5. if(dom.attachEvent) {


6. dom.attachEvent('on' + eventType, fn);


7. }


8.}


9.


10.// 下面是删除事件


11.if(dom.removeEventListener) {


12. dom.removeEventListener(eventType, fn, false);


13.} else {


14. if(dom.detachEvent) {


15. dom.detachEvent("on" + eventType, fn)


16. }


17.}


  • 冒泡和捕获的一个小demo
1.<!DOCTYPE html>


2.<html>


3.<head>


4. <meta charset="utf-8">


5. <title>bubble event</title>


6. <style type="text/css">


7. body{margin:0;}


8. #one{


9. width:500px;


10. height:500px;


11. background:rgb(255,0,0);


12. border: 1px solid transparent;


13. }


14. #two{


15. width:400px;


16. height:400px;


17. margin: 0 auto;


18. margin-top: 50px;


19. background:rgb(255,50,50);


20. border: 1px solid transparent;


21. }


22. #three{


23. width:300px;


24. height:300px;


25. margin: 0 auto;


26. margin-top: 50px;


27. background:rgb(255,100,100);


28. border: 1px solid transparent;


29. }


30. #four{


31. width:200px;


32. height:200px;


33. margin: 0 auto;


34. margin-top: 50px;


35. background:rgb(255,150,150);


36. }


37. </style>


38.</head>


39.<body>


40. <div >


41. <div >


42. <div >


43. <div >


44. </div>


45. </div>


46. </div>


47. </div>


48.


49. <script>


50. var one = document.getElementById('one');


51. var two = document.getElementById('two');


52. var three = document.getElementById('three');


53. var four = document.getElementById('four');


54.


55. var useCapture = false; //false为冒泡获取【目标元素先触发】 true为捕获获取【父级元素先触发】


56. one.addEventListener('click', function(event) {


57. event || (event = window.event);


58. console.log(event);


1. 事件对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

  • 什么时候会产生Event 对象呢?
    • 例如: 当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象.
  • 事件通常与函数结合使用,函数不会在事件发生前被执行!

2. 事件流

2.1 事件流发展史

  • 事件发展史,这位大神已经写好了,想去偷瞄两眼的请点击这里

2.2 冒泡

  • 什么是事件冒泡,
    • 官方的定义就是从最特定的事件目标到最不特定的事件目标

意思就是说,假如用户单击了一个元素,该元素拥有一个click事件,那么同样的事件也将会被它的祖先触发,这个事件从该元素开始一直冒泡到DOM树的最上层,这一过程称为事件冒泡

2.3 捕获

  • 什么是事件捕获

事件捕获和事件是相反的,也就是说,当用户触发了一个事件的时候,这个事件是从DOM树的最上层开始触发一直到捕获到事件源.

2.4 事件流

  • 它的由来

由于微软和网景乱搞,后来必须要为事件传播机制,制定一个标准,因为事件捕获是网景公司开发出来的,而事件冒泡是由微软公司开发出来的,它们都想要自己的技术成为标准,所以导致这两个公司老是干架,制定标准的人为了不让它们干架,所以研发了事件流.

2.5 事件流的写法以及实现方式

  • 标准实现方式使用关键词addEventListener,假如你想要给某一个元素添加事件,现在就可以这样写element.addEventListener(eventType, fn, false)
    • dom对象.addEventListener(事件类型, 回调函数, 事件机制)这里的事件类型表示你要使用哪种事件类型比如click, 回调函数里面写着触发此事件你要做什么事情, 事件机制分为冒泡和捕获,如果为false表示事件冒泡,为true表示事件捕获
  • 既然有标准的实现方式,那么肯定也存在着不和谐的写法,没办法谁让人家牛逼呢,俗话说的好啊两虎之争必有一伤,可伤了我们程序员了.这种不和谐的写法是
    • dom对象.attachEvent(eventType, fn)第一个参数表示事件类型,第二个是回调.这种写法兼容IE, IE没有实现事件捕获,因为在当时他比较厉害,以为没必要…………只是,,,,省略一千字, 现在微软的浏览器已经做得很好了… 只是调侃一下无其他意图..
  • 以上的两种写法一种是兼容W3C标准的一种是老版IE的写法,怎么写兼容性写法呢?下面是注册事件和删除事件的Code
1.// 注册时间


2.if(dom.addEventListener) {


3. dom.addEventListener(eventType, fn);


4.} else {


5. if(dom.attachEvent) {


6. dom.attachEvent('on' + eventType, fn);


7. }


8.}


9.


10.// 下面是删除事件


11.if(dom.removeEventListener) {


12. dom.removeEventListener(eventType, fn, false);


13.} else {


14. if(dom.detachEvent) {


15. dom.detachEvent("on" + eventType, fn)


16. }


17.}


  • 冒泡和捕获的一个小demo
1.<!DOCTYPE html>


2.<html>


3.<head>


4. <meta charset="utf-8">


5. <title>bubble event</title>


6. <style type="text/css">


7. body{margin:0;}


8. #one{


9. width:500px;


10. height:500px;


11. background:rgb(255,0,0);


12. border: 1px solid transparent;


13. }


14. #two{


15. width:400px;


16. height:400px;


17. margin: 0 auto;


18. margin-top: 50px;


19. background:rgb(255,50,50);


20. border: 1px solid transparent;


21. }


22. #three{


23. width:300px;


24. height:300px;


25. margin: 0 auto;


26. margin-top: 50px;


27. background:rgb(255,100,100);


28. border: 1px solid transparent;


29. }


30. #four{


31. width:200px;


32. height:200px;


33. margin: 0 auto;


34. margin-top: 50px;


35. background:rgb(255,150,150);


36. }


37. </style>


38.</head>


39.<body>


40. <div >


41. <div >


42. <div >


43. <div >


44. </div>


45. </div>


46. </div>


47. </div>


48.


49. <script>


50. var one = document.getElementById('one');


51. var two = document.getElementById('two');


52. var three = document.getElementById('three');


53. var four = document.getElementById('four');


54.


55. var useCapture = false; //false为冒泡获取【目标元素先触发】 true为捕获获取【父级元素先触发】


56. one.addEventListener('click', function(event) {


57. event || (event = window.event);


58. console.log(event);