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 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
JavaScript动态调整TextArea高度的代码
Dec 28 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
Oct 11 Javascript
使用javascript为网页增加夜间模式
Jan 26 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
Vue.js组件tree实现无限级树形菜单
Dec 02 Javascript
Mongoose中document与object的区别示例详解
Sep 18 Javascript
js 显示日期时间的实例(时间过一秒加1)
Oct 25 Javascript
React/Redux应用使用Async/Await的方法
Nov 16 Javascript
详解vue中async-await的使用误区
Dec 05 Javascript
Vue infinite update loop的问题解决
Apr 23 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
django 微信网页授权登陆的实现
2019/07/30 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
幼师自荐信范文
2013/10/06 职场文书
公司道歉信范文
2014/01/09 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
年会主持词结束语
2014/03/27 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
项目经理任命书范本
2014/06/05 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
小班上学期个人总结
2015/02/12 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python