[ 面试没回答上的问题2]IOS上给body绑定click事件的bug

Posted 行,无所谓崎岖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ 面试没回答上的问题2]IOS上给body绑定click事件的bug相关的知识,希望对你有一定的参考价值。

  面试被问到ios上的bug,自己提到绑定click事件的bug,但是并没有把问题讲的很清楚,这里再清理一下思路。

  这个bug只在IOS上有,包括ihone,ipad,由于ios浏览器都用的safari内核,所以ios浏览器全部中枪。

  bug描述

  在进行事件委托时,如果将未存在于DOM的元素事件直接委托到body上的话,会导致事件委托失效,调试结果为事件响应到body子元素为止,既没有冒泡到body上,也没有被body所捕获。但如果事件是DOM元素本身具有的,则不会触发bug。换而言之,只有元素的非标准事件(比如click事件之于div)才会触发此bug。

   

  1. 如何避免bug触发:不要委托到body结点上,委托到任意指定父元素都可以,或者使用原生具有该事件的元素,如使用click事件触发就用a标签包一层。

  2. 使用touch事件代替click,如果是弹出层会有点透的问题存在。
  3. 已触发如何修补:safari对事件的解析非常特殊,如果一个事件曾经被响应过,则会一直冒泡(捕获)到根结点,所以对于已大规模触发的情况,只需要在body元素的所有子元素绑定一个空事件就好了,如:

    ("body > *").on("click", function(){};);
    

    可能会对性能有一定影响,但是使用方便,大家权衡考虑吧~~~

  

以上是关于[ 面试没回答上的问题2]IOS上给body绑定click事件的bug的主要内容,如果未能解决你的问题,请参考以下文章

[面试没回答上的问题3]数组的去重

Body 元素上的 Vue JS 样式绑定

滴滴前端面试问题没被难倒,自我介绍面试时被考察等环节回答却是灾难现场

[面试没答上的问题1]http请求,请求头和响应头都有什么信息?

C/C++面试题库:这些问题你回答得出来吗

iOS上的c ++,如何将抽象类型变量移动到线程中?