基于WebStorm记录得HTML--Event(一)事件

房东的猫 提交于 2020-01-26 23:14:36

1.1 事件

  事件:是可以被js检测到的行为,实质上是一种交互操作。

  例如:我们可以给某按钮添加一个onClick点击事件,当用户对按钮发生点击时来触发某个函数。 

  事件的作用:

  (1)各个元素之间可以借助事件来进行交互           

  (2)用户和页面之间也可以通过事件来交互

  (3)后端和页面之间也可以通过事件来交互(减缓服务器的压力)

ps:注意:事件通常与函数配合使用,当事件发生时函数才会执行。

1.2 件传播/事件传递/事件流

一个事件发生后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段

第一阶段:从window对象传导到目标节点(上层传到底层),称为“捕获阶段”(capture phase)。

第二阶段:在目标节点上触发,称为“目标阶段”(target phase)。

第三阶段:从目标节点传导回window对象(从底层传回上层),称为“冒泡阶段”(bubbling phase)。

w3c规定:事件冒泡+事件捕获+事件真正的触发者等各个分支构成了js的事件机制。

ps:如没有特殊情况,均采用事件冒泡。

psHTML事件采用冒泡机制来处理事件。即

   点击d2时会先执行d2的绑定事件(即执行test2函数)。

   然后采用事件冒泡将事件传递给上一级DOM节点d1,然后d1执行自己的绑定事件。

ps:函数执行的顺序按照绑定事件时函数的顺序为准

HTML事件缺陷:耦合性太强了,修改一处另一处也要修改。

                 当函数没有加载成功时,用户去触发事件,则会报错。

2.2 DOM0级事件

js脚本中,直接通过【on+事件名方式绑定的事件称为是DOM0级事件。

语法:元素.on+事件名  = function(){需要执行的语句;}

 例如:

  btn.onclick = function () {console.log(‘按钮被点击’);};

ps:以冒泡机制来处理事件,不存在兼容的问题

DOM0级事件的移除方式:元素. on+事件名=null;eg:btn.οnclick=null;

2.3 DOM2级事件

js脚本中,通过addEventListener函数绑定的事件称为是DOM2级事件。

语法:元素.addEventListener(type,listener,useCapture)

 type:事件类型。没有on!没有on!没有on
     listener:
监听函数,绑定的函数
    
useCapture:是否使用捕获机制。如果不写,默认值为false
       false:
冒泡机制
      
true:捕获机制
  注意
:DOM2级事件可以绑定多个函数,执行顺序按照函数书写的顺序。

DOM2级事件的移除方式: node.removeEventListener(type,外部函数名,useCapture)

  egbtn.removeEventListener('click',test,true);

psDOM2级事件中如果绑定函数为匿名函数则无法删除。能够删除的只能是外部函数。

pss:第三个参数默认可以不写,默认是false。但是如果删除的是捕获事件,则必须写为true才可以。

3.IE浏览器中的事件绑定

(1)HTML事件处理程序:等同于非IE
(2)DOM0
级事件:等同于非IE
(3)DOM2
级事件:

js脚本中,通过attachEvent函数绑定事件

 语法:元素.attachEvent(type,listener)

   type:事件类型。on!有on!有on】 listener:监听函数,绑定的函数  注意:如果绑定多个函数,按照函数书写的倒叙执行。

IEDOM2级事件的移除方式:

  元素.detachEvent(type,listener)  eg:  function test() {alert(111);}
  d1.attachEvent("onclick",test
);
  d1.detachEvent('
onclick',test);

ps:匿名函数无法被移除。

4.解决浏览器中关于事件绑定兼容性问题

由于【IE浏览器中的事件绑定IE浏览器中的事件绑定方式方法都有所不同。所以单一的某种函数都不能完美解决不同浏览器下的方法绑定问题。那么我们又应该如何面对在不同浏览器下【事件绑定这个问题的解决方案呢? 以下为解决方案的思路。绑定事件时:  如果能使用addEventListener方法绑定的,就采用本方法  否则采用attachEvent方法绑定

   解绑事件时:  如果能采用addEventListener方法绑定的,就采用removeEventListener方法解绑  否则采用detachEvent方法解绑

var Event = {
  addEvent: function (ele, type, handler) {

  if (ele.addEventListener)  {ele.addEventListener(type, handler);}

  else if (ele.attachEvent)   {ele.attachEvent('on' + type, handler);}

  else {ele['on' + type] = handler;}

  },

  removeEvent: function (ele, type, handler) {

  if (ele.addEventListener)   {ele.removeEventListener(type, handler);}

  else if (ele.attachEvent)   {ele.detachEvent('on' + type, handler);}

  else {ele['on' + type] = null;}
  }
};

function test() {alert('点击事件');}
Event.addEvent(document.querySelector('div'), 'click', test);

 

5.鼠标事件

js鼠标事件是指通过鼠标一系列操作(如进入,点击等)来触发的事件。

(1)鼠标事件类型

鼠标单击是触发:click
鼠标双击是触发:dblclick

鼠标按下时触发:mousedown
鼠标抬起时触发:mouseup

鼠标移动时触发:mousemove

鼠标移入时触发(不冒泡)mouseenter

鼠标移出时触发(不冒泡)mouseleave
鼠标移入时触发(冒泡)mouseover

鼠标移出时触发(冒泡)mouseout

语法:元素.on+鼠标事件名称 = 调用函数

例如:d1.ondblclick = function () { console.log('这是d1');};

(2)鼠标事件原则

 

a.鼠标的基本事件默认采用冒泡传递

b.可以给一个元素添加多个不同的鼠标事件,不同的鼠标事件之间互不影响

c.mouseentermouseleave两个事件不冒泡触发。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!