jQuery事件委托之Safari


Posted in Javascript onJuly 05, 2016

什么是事件委托

事件委托是Jquery中一种事件绑定的方式,不同于常见的事件绑定方式将事件绑定在目标元素上,而是将事件绑定在父级元素上通过事件冒泡来执行绑定函数。

//常见的事件绑定(Jquery)
$(element).click(function(){
//do something
})
//事件委托(Jquery)
$(parents).on("click",element,function(){
//do something
})

事件委托的原理

事件委托将事件监听绑定在目标元素的父级上,当目标元素响应事件时冒泡到绑定事件的父级上,进行判断该事件的目标元素是否是传入的元素,如果是就执行传入的函数。

//简单实现Jquery的事件委托
<ul id="oParent"></ul>
<a id="oClick" href="javascript:void(0)">click</a>
<script type="text/javascript">
var oParent=document.getElementById("oParent"),oClick=document.getElementById("oClick");
Object.prototype.on=function(ev,fn,obj){
var sClass=Object.prototype.toString.call(obj);
if(obj||sClass.indexOf("HTML")===-1){//假装判断一下是否需要事件委托
this.addEventListener(ev,function(e){
var e=e||window.event;
if(e.target===obj&&e.type===ev){
fn.call(e.target);//传入目标元素
}
},false);
}else{
this.addEventListener(ev,fn,false);
}
}
document.on("click",function(){console.log(this)},oClick);

没有做任何的兼容以及其他处理,只是为了了解原理,大家有什么问题可以留言指出。
事件委托有什么用呢

说这么多东西,到底事件委托有什么用呢?我认为事件委托最大的好处在于,动态生成的元素还会保留原有的事件绑定。

//a点击的时候,ul都会新增一个li,新增的li都有绑定事件
<ul id="oUl">
<li><li>
</ul>
<a id="addBtn" href="javascript:void(0)" target="_self">新增li</a>
<script>
//使用常用事件绑定实现
$("#oUl").find("li").on("click",function(){
//do something
})
$("#addBtn").on("click",function(){
$("#oUl").append("<li></li>");
$("#oUl").find("li").on("click",function(){
//do something
})
})
//先不说性能问题,这样的实现美观,符合逻辑吗
//使用事件委托实现
$("document").on("click","#oUl li",function(){//这里委托元素是灵活的,只要是父级就行,只是不是动态生成(动态生成就失去事件委托的意义了)
//do something
})
$("#addBtn").on("click",function(){
$("#oUl").append("<li></li>");
})
//这样的代码是不是简洁多了,解决了重复绑定的问题

今天的主题,事件委托之Sarfari

一次项目中遇到的问题,click事件委托在移动端的safari上失效了

<p class="loadmore">加载更多</p>
<script type="text/javascript">
$(document).on("click",".loadmore",function(){
alert("ok")
})
</script>

看上面的代码,很简单吧,没什么问题吧,除了ios的safari,其他浏览器都能正常的弹出“ok”,一开始想到会不会是什么有地方把冒泡阻止了,但是没有找到,jq的问题?,换了还是不行。正常的绑定(不使用事件委托)没问题,其他想到会不会是jq的bug,如果是jq的bug,那么以前的项目也会有类似的bug,于是到线上去找相关的代码

<a id="test" target="_slef" href="javascript:void(0)">test</a>
<script>
$("document").on("click","#test",function(){
//do something
})
</script>

在安卓和ios设备上测试,没有任何问题,代码都差不多啊,但是大家注意到没,标签不一样(html语义化多重要啊),于是将p换成a,问题完美解决,最后去谷歌了一下。

ios的safari中当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效。

原因很清楚了,safari中不可点击元素的click事件不会冒泡到document和body上。

解决办法

1.将click事件直接绑定到元素上(不使用事件委托)

2.需要绑定click事件的元素改成<a>或者<button>等可点击元素

3.将click事件委托到非doucument或body的父级元素上

4.给目标元素添加一条css样式 cursor:pointer(推荐这种,方便省事)

以上所述是小编给大家介绍的jQuery事件委托之Safari,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript中创建对象的三种常用方法
Dec 30 Javascript
Javascript玩转继承(三)
May 08 Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 Javascript
JS扩展方法实例分析
Apr 15 Javascript
js中函数声明与函数表达式
Jun 03 Javascript
jQuery简单设置文本框回车事件的方法
Aug 01 Javascript
正则表达式替换html元素属性的方法
Nov 26 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
JS基于正则表达式的替换操作(replace)用法示例
Apr 28 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 Javascript
js+h5 canvas实现图片验证码
Oct 11 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
Jul 05 #Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 #Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
Jul 05 #Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 #Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 #Javascript
Node.js实现文件上传
Jul 05 #Javascript
JavaScript数组方法大全(推荐)
Jul 05 #Javascript
You might like
用PHP实现ODBC数据分页显示一例
2006/10/09 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
python之wxPython应用实例
2014/09/28 Python
Python程序退出方式小结
2017/12/09 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
基于python实现把图片转换成素描
2019/11/13 Python
使用python+whoosh实现全文检索
2019/12/09 Python
为什么是 Python -m
2020/06/19 Python
Python创建自己的加密货币的示例
2021/03/01 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
如何设置Java的运行环境
2013/04/05 面试题
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
英语感恩演讲稿
2014/01/14 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
批评与自我批评材料
2014/02/15 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
go语言中json数据的读取和写出操作
2021/04/28 Golang