编 写:袁 亮
时 间:2015-11-16
说 明:jquery事件绑定
一、作用
1、将html显示与js动态交互分离,不在html中写一堆的onclick等js
2、简化代码,统一处理,防止遗漏以及重复写,比如ajax请求等
3、结构清晰,分层,html,css,js等独立
二、如何绑定事件
1、bind:向匹配元素添加一个或多个事件处理器
1.1 所有jquery版本均支持,但1.7版本后,推荐使用on
1.2 只能对已经存在的元素进行事件绑定
1.3 了解即可,不使用
2、live:向当前或未来的匹配元素添加一个或多个事件处理器
2.1 jquery 1.9版本以上,已经删除
2.2 使用on来代替
3、delegate:为指定的元素(被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)
3.1 jquery 1.4以上版本支持
3.2 1.7以下版本的时候可以考虑使用,旧项目,新项目使用不要使用
4、on【重点】:为指定的元素,添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。使用 on() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)
4.1 jquery 1.7以上版本支持
4.2 尽量使用这个,不要使用其他三种绑定
三、简单例子
$("选择器").on({
click:function(){
console.log("我是"+$(this));
console.log("点击触发");
},
mouseout:function(){
console.log("我是"+$(this));
console.log("鼠标触发");
}
},"子选择器(可选)");
四、常见问题(1.72版本jquery下测试)
1、元素后加载,事件绑定不成功
1.1 示范代码
<code>
<div class="test">你好</div>
<script type="text/javascript">
$(function(){
//a标签事件绑定
$(".test a").on({
click:function(){
console.log("click");
}
});
//后加载生成dom节点
$(".test").prepend("<a>测试连接</a><hr>");
});
</script>
</code>
1.2 因为a标签是后加载的元素,在绑定事件的时候,dom数上还没有该元素,因此绑定失败
2、解决办法1
2.1 事件绑定在已经存在的父元素上,匹配选择器是否符合
2.2 示例代码
<code>
<div class="test">你好</div>
<script type="text/javascript">
$(function(){
//后加载生成dom节点
$(".test").prepend("<a>测试连接</a><hr>");
//a标签事件绑定
$(".test").on({
click:function(){
console.log("click");
}
},"a");
});
</script>
</code>
2.3 优点:绑定事件与处理逻辑脱离,代码更简单易懂
2.4 缺点:需要注意选择器必须是已经存在的节点,子选择器可以是后加载的元素,不清楚的话,可以直接绑定在document上
iphone下,会出问题,元素需要添加cursor: pointer;样式,手机使用,不采用这个
3、解决办法2
3.1 在元素加载后,执行绑定函数
3.2 实例代码
<code>
<div class="test">你好</div>
<script type="text/javascript">
$(function(){
$(".test").prepend("<a>测试连接</a><hr>");
$(".test a").on({
click:function(){
console.log("click");
}
});
});
</script>
</code>
3.3 优点:各种情况都兼容,不会出现绑定失败
3.4 缺点:代码可能不是那么好看,绑定事件混在了处理逻辑中
五、使用建议
1、使用1.7以上版本jquery,2.0以下(不兼容ie8及以下版本)
2、绑定事件均使用on来绑定,不要使用其他的
3、对于后加载元素,在加载完成之后进行事件绑定,避免兼容性问题
六、原理,额外拓展,dom树结构(了解即可)
1、可以使用off来取消事件绑定
2、可以使用.one,只绑定一次,触发之后就取消绑定
3、页面dom数结构
4、事件如何冒泡
附参考文档:
1、浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式
2、jQuery三种事件绑定方式.bind(),.live(),.delegate()