对于浏览器的事件机制有了新的认识

最重要的一个事件:addEventListener   接收三个参数    1,事件类型  2.事件触发的函数  3 (可选)是否捕获

在w3c标准的浏览器下事件是冒泡类型的      从最具体的元素到某个节点被取消冒泡或者一直冒泡到根节点(他也支持捕获类型)

值得一提的是,在正常的浏览器中用addEventListener他的第三个参数可以用来设置是否捕获,默认是false,设置这个值为true,意味着事件触发是从不具体的到具体,至于接下来怎么样,和事件是否支持冒泡有关

在应用中我发现了一些不支持冒泡的属性,了解这几个特殊属性,避免浪费不要的时间

1:值得一提的 scroll 事件(因为现在就深入用了这一个)

  scroll 事件,就是浏览器的滚动条事件 mdn上对这个事件是否冒泡的描述是 在元素上不会冒泡,在document的default view上面会冒泡,后面这个不知道什么鬼。至少我知道的在一些带有滚动条的列表页滚动事件的触发,是不会冒泡到document ,window 这些节点上;那么如果 能够设置绑定在window,document 上面的滚动事件 是捕获的 ,事情就有些不一样了

                

document.addEventListener('scroll', function(event) {
       
},true}

 

设置第三个参数为true 这样在滚动 inner 的滚动条的时候,document的scroll事件也是会被触发的,早于在inner上面绑定的事件发生

                                                           

                                                 这个是断点调试的jq event 对象,currentTarget =document   target=div   

这样子的话,在一些不能够获取页面元素的情况下,比如表单的在没有加载出来的时候是获取不到的,就可以采用 scroll 捕获的方式 和事件委托类似的做法,不同的只是触发顺序,之前知道的事件委托是在冒泡阶段去判断,然而现在碰到一些不能冒泡事件只能在捕获阶段去做事件委托

2,其实这个事件不冒泡也蛮好理解的,从直观的角度去解释,为什么Click事件会冒泡?因为你点击了子元素,由于包含关系其实你也点击了父元素,父元素的父元素。。。爸爸爷爷无穷尽,直到根,那么scroll事件冒泡的话会怎么样,比如我一个表单有scroll事件,然后冒泡,意味着所有父元素也发生了滚动事件。。。显然这是很不科学的,有可能除了自己谁都没有滚动条

   以此推来,轻易就能推出一些事件是不支持冒泡的 foucs blur mouseenter mouseleave

  focus:我获得了焦点并不意味着我的父元素获得焦点

  mouseleave:触发了Mouseleave事件并不意味着我的父元素也发生了mouseleave,父元素和我一样大么?比我大,或者为0就会造成矛盾

  .......

  所有的事件细想一下都能解释的通,然后仔细看了下其实不能冒泡的事件占了绝大多数,可能是click事件接触的太多,理所当然的认为,什么事件都和click事件差不多,其实现在看来还真不是这样的 mdn对于浏览器事件的一个概览

然后,scroll事件的触发节奏是非常快的,可能你一个滚动条下来就会触发上百次,所以节流是很重要的,否则对页面性能会有影响,做一些重的,耗时的操作,可能会很卡

MDN:scroll 事件可能会被高频度的触发, 因此事件的handler不应执行重型操作,例如DOM操作就不应该放在事件处理中。推荐的处理方案是使用 requestAnimationFramesetTimeout 或 customEvent

posted @ 2017-08-14 23:39  llauser  阅读(361)  评论(0)    收藏  举报