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 相关文章推荐
checkbox设置复选框的只读效果不让用户勾选
Aug 12 Javascript
Node调试工具JSHint的安装及配置教程
May 27 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
Nov 17 Javascript
JavaScript encodeURI 和encodeURIComponent
Dec 04 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
js创建数组的简单方法
Jul 27 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
vue.js实现价格格式化的方法
May 23 Javascript
Jquery中attr与prop的区别详解
May 27 jQuery
Vue实现背景更换颜色操作
Jul 17 Javascript
解决vue2中使用elementUi打包报错的问题
Sep 22 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 归并排序 数组交集
2011/05/10 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php数组去重复数据示例
2014/02/25 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
javascript实现复选框全选或反选
2017/02/04 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
python中logging库的使用总结
2017/10/18 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
岗位职责的构建方法
2014/02/01 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
校庆活动策划方案
2014/06/05 职场文书
道路施工安全责任书
2014/07/24 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书