重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在项目开发中,经常遇到绑定事件不起作用,或者事件绑定多次,导致重复触发。
创新互联是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:网站制作、网站建设、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。
1.事件绑定的几种常见方式(以click事件为例)
jquery:
$(selector).click(function(){...})
$(selector).bind("click",function(){...})
$(selector).live("click",function(){...})
$(document).delegate("selector","click",function(){...})
$(selector).on("click",function(){...})
虽然有以上四种基本方式绑定,但无论你用哪一种,底层实现都是由on事件绑定完成,唯一的区别就是书写方便和个人习惯而已。
bind方法
会给每一个符合selector的元素添加click执行函数,即:将click事件绑定到所有设置了的selector元素上,如果动态添加了元素,之前绑定事件也起作用
live方法
将事件绑定在document上,所有事件触发冒泡到根节点document的时候,判断是否为click事件、并且是否为selector元素都符合则执行事件函数
delegate方法
原理上delegate方法和live方法很类似,都是传递选择器和执行函数两个参数到document上判断,
$(document).delegate("selector","click",function(){...})
约等于
$("selector").live("click",function(){...})
[注意:live事件,jQuery 1.7以后版本使用on代替live,且移动设备safari浏览器不支持live事件]
【穿插解决方案:
移动设备safari浏览器不支持live事件
方法一:
首先要给绑定click事件的元素加上样式:cursor: pointer;
然后再用live绑定事件
'selector').live('click', () {alert('你点我了'
如果方法一对你无效,你也可以用
方法二:
同样也给绑定click事件的元素加上样式:cursor: pointer;
然后用on来绑定事件,jquery1.7后推荐用on来动态绑定事件,因为比live更高效
$(document).on('click', 'selector', function() { alert('你点我了'); });
】
唯一的区别在于delegate的性能会比live稍好一些,因为live方法需要遍历整个dom去查selector而delegate只需要监测document就够了,想要更深入了解可以自己去网上查阅下。
on方法
on的绑定原理和bind差不多,但是on在性能上占优势。
2.事件重复绑定的可能原因
大量使用ajax
将所有事件写在一个大方法里,如:
var clickEvent = function(){
$(a).bind(...);
$(b).bind(...);
}
在大量使用ajax时,为了触发事件会在success里调用clickEvent方法,然后由于其他地方需要触发同样的事件又会调用clickEvent,这样很容易导致多次触发。
解决方案:避免这样使用
嵌套元素的事件冒泡
解决方案:
e.preventDefault()//阻止默认
e.stoppropagation()//阻止冒泡
频繁使用trigger函数
可能有时候的需求需要触发某个特定事件,这时我们会想当然使用trigger触发事件,但是却没有考虑到带来的隐患。尤其是一个事件去trigger另一个事件
解决方案:阻止事件冒泡,见上,
或者使用triggerhandler(慎用,不支持chrome貌似)
以button的Click事件为例:
function clickBtn() { alert('click!'); }
1、直接在元素上绑定回调函数
2、JS获取DOM元素对象后,对onclick属性赋值,绑定事件: document.getElementById('btn').onclick=clickBtn;
3、JS获取DOM对象后,调用对象的addEventListener函数绑定事件:document.getElementById('btn').addEventListener('click',clickBtn);
现阶段主流浏览器兼容的绑定事件方式就这3种