首页 > 代码库 > Jquery之事件绑定(bind(),live(),delegate(),on())

Jquery之事件绑定(bind(),live(),delegate(),on())

1、.bind()

描述: 为一个元素绑定一个事件处理程序。

.bind()一个基本的用法:

$(selector).bind('click', function() {
  alert('User clicked on "foo."');
});
可以直接用原生js替代为:
$(selector).click( function() {
  alert('User clicked on "foo."');
});
在jQuery1.4.3,您现在可以通过传递false代替一个事件处理程序。这将相当于一个事件处理程序绑定写成这样:function(){ return false; }。在以后通过调用.unbind( eventName, false )来移除这个函数。

具体请参照:http://www.css88.com/jqapi-1.9/bind/

2、live()

描述: 附加一个事件处理器到匹配目前选择器的所有元素,现在和未来。

.live()方法是简单的;以下是三种事件添加方法的模板,它们是等价的:

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+
events 参数可以是一个空格隔开的事件类型名称的列表和可选的命名空间,或事件名称字符串和处理程序的对象。data参数是可选的,可以省略。例如,以下三种方法调用方式在功能上是相同的(后文还提供了更有效,性能更好的添加代理事件处理的方式):
$("a.b").live("click", function(){ alert("Goodbye!"); });                // jQuery 1.3+
$(document).delegate("a.offsite", "click", function(){ alert("Goodbye!"); });  // jQuery 1.4.3+
$(document).on("click", "a.offsite", function(){ alert("Goodbye!"); });        // jQuery 1.7+
.live()方法不再推荐使用。特别是,使用.live()出现的以下问题:
在调用 .live() 方法之前,jQuery 会先获取与指定的选择器匹配的元素,这一点对于大型文档来说是很花费时间的。
不支持链式写法。例如,$("a").find(".offsite, .external").live( ... ); 这样的写法是不合法的,并不能像期待的那样起作用。
由于所有的 .live() 事件被添加到 document 元素上,所以在事件被处理之前,可能会通过最长最慢的那条路径之后才能被触发。
在移动 iOS (iPhone, iPad 和 iPod Touch) 上,对于大多数元素而言,click 事件不会冒泡到文档 body 上,并且如果不满足如下情况之一,就不能和 .live() 方法一起使用:
使用原生的可被点击的元素,例如, a 或 button,因为这两个元素可以冒泡到 document。
在 document.body 内的元素使用 .on() 或 .delegate() 进行绑定,因为移动 iOS 只有在 body 内才能进行冒泡。
需要 click 冒泡到元素上才能应用的 CSS 样式 cursor:pointer (或者是父元素包含 document.documentElement)。但是依需注意的是,这样会禁止元素上的复制/粘贴功能,并且当点击元素时,会导致该元素被高亮显示。
在事件处理中调用 event.stopPropagation() 来阻止事件处理被添加到 document 之后的节点中,是效率很低的。因为事件已经被传播到 document 上。
.live() 方法与其它事件方法的相互影响是会令人感到惊讶的。例如,$(document).unbind("click") 会移除所有通过 .live() 添加的 click 事件!
对于仍在使用.live()的页面,那么下面关于该方法在不同版中的区别,可能会对您有一定帮助:
在 jQuery 1.7 之前,如果想阻止通过 .live() 绑定的事件被冒泡到其它元素上,必须在事件处理中返回 false。调用 .stopPropagation() 是不起作用的。
从 jQuery 1.4 开始,.live() 方法支持自定义事件,也支持所有 JavaScript 事件冒泡。它还支持一些原本不能冒泡的事件,包括 change, submit, focus 和 blur。
在 jQuery 1.3.x 中,只能绑定如下 JavaScript 事件:click, dblclick, keydown, keypress, keyup, mousedown, mousemove, mouseout, mouseover, 和 mouseup.

具体请参照:http://www.css88.com/jqapi-1.9/live/

例子:
Example: 点击段落时,添加另一个段落。注意,.live() 会为所有的段落(包括新生成的段落)绑定事件。

$("a").live("click", function() { return false; })

Example: 通过使用 preventDefault 方法仅取消默认的动作。
$("a").live("click", function(event){
  event.preventDefault();
});

Example: 使用 .live() 绑定自定义事件。

$("p").live("myCustomEvent", function(e, myName, myValue) {
  $(this).text("Hi there!");
  $("span").stop().css("opacity", 1)
           .text("myName = " + myName)
           .fadeIn(30).fadeOut(1000);
});
$("button").click(function () {
  $("p").trigger("myCustomEvent");
});

Example: 使用映射绑定多个事件处理。注意,.live() 会为所有的段落(包括新生成的段落)绑定 click, mouseover, 和 mouseout 事件。
$("p").live({
  click: function() {
    $(this).after("<p>Another paragraph!</p>");
  },
  mouseover: function() {
    $(this).addClass("over");
  },
  mouseout: function() {
    $(this).removeClass("over");
  }
});
3、delegate()
描述: 为所有匹配选择器(selector参数)的元素绑定一个或多个事件处理函数,基于一个指定的根元素的子集,匹配的元素包括那些目前已经匹配到的元素,也包括那些今后可能匹配到的元素。

这些是两种方法的等效的方法:

// jQuery 1.4.3+
$( elements ).delegate( selector, events, data, handler );
// jQuery 1.7+
$( elements ).on( events, selector, data, handler );

例如, 下面的 .delegate() 代码:
$("table").delegate("td", "click", function() {
  $(this).toggleClass("chosen");
});

从jQuery 1.7开始,.delegate()已经被.on()方法取代

是等价于下面使用.on()的代码:

$("table").on("click", "td", function() {
  $(this).toggleClass("chosen");
});

要移除使用delegate()绑定的事件,.undelegate()方法。

直接给例子:

<script type="text/javascript">
	$(document).ready(function(){
		$("p").delegate("dragstart",function(){
			$(this).append("<span>发生了dragstart事件</span>");
		});	
		$("#btn").click(function(){
			$("p").undelegate("dragstart");
		});	
	});																				
</script>

具体请参照:http://www.css88.com/jqapi-1.9/delegate/

4、on()

jQuery on()方法是官方推荐的绑定事件的一个方法。

$(selector).on(event,childSelector,data,function,map)
直接上例子:tip:如果你需要移除on()所绑定的方法,可以使用off()方法处理。

$(document).ready(function(){
  $("p").on("click",function(){
    $(this).css("background-color","pink");
  });
  $("button").click(function(){
    $("p").off("click");
  });
});

tip:如果你的事件只需要一次的操作,可以使用one()这个方法

$(document).ready(function(){
  $("p").one("click",function(){
    $(this).animate({fontSize:"+=6px"});
  });
});

具体请参照:http://www.cnblogs.com/leejersey/p/3545372.html