最近一个项目的前端有这样的一个需求:页面中有某按钮,点击按钮之后通过服务器的返回信息更改这个按钮的点击事件执行函数。
之前小猪使用的方法是给按钮增加class。在jquery中通过class查找到之后使用click增加函数功能
$(".class1").click(function(){ $(this).removeClass("class1"); $(this).addClass("class2"); });
这样的代码是实现了样式上的变化。但是虽然样式变化了(class1=>class2),但是再次点击该按钮时执行的还是缺是执行了,class1的函数。
到此,此方案不可行。
小猪之前知道给函数增加时间jQuery不仅提供了方案一的方法,还有bind方法
bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数。
$(".class1").bind("click".function(){ $(this).removeClass("class1"); $(this).addClass("class2"); });
小猪自信满满的准备看到期待的结果。。
可是~~~。。。。。。
看来bind方法和直接使用click的效果是一样的。
使用live()方法:
live() 方法为被选元素附加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。
语法:
$(selector).live(event,data,function)
通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)。这不是正是我想要的嘛!
$(".class1").live("click".function(){ $(this).removeClass("class1"); $(this).addClass("class2"); });
这样,在改变了其样式的同时也改变了其运行的函数。
live与bind和直接添加不同,我的理解就是一个监听事件在冒泡阶段,一个监听事件在执行阶段(不知jQuery怎么在捕获阶段监听事件)。
.live() 方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应。传递给 .live() 的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM 树的根节点上。
如下面的例子:
$('.clickme').live('click', function() { alert("Live handler called."); });
然后再添加一个新元素:
$('body').append('<div class="clickme">Another target</div>');
然后再点击新增的元素,他依然能够触发事件处理函数。
在我们的例子中,当点击新的元素后,会依次发生下列步骤:
由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。