jquery 委托 on() | off()删除委托 | one()只执行一次的委托
《1》
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="jquery-1.11.2.js"></script> </head> <body> <!--------------------------------live()|die()--> <button id="a">a</button> <button id="b">b</button> <button id="c">c</button> <!--------------------------------delegate()|undelegate()--> <div id="box"> <input type="button" value="按钮" /> <button>我是button</button> </div> <!----------------------------on()|off()| one()--> <a href="http://www.baidu.com" target="_blank">百度</a> </body> </html> <script type="text/javascript"> //-------------------------------------------------live() $("button").live("click", function () { alert('点击了') }) //上面这段代码的意思是:调用live方法将document绑定一个click事件。当单击button元素触发click事件的时候,首先会调用event.type属性来判断当前事件是否是一个click事件,同时会调用event.target来判断当前点击的元素是不是button元素,如果是的话,那么就触发这个click事件,所以弹出了“点击了” //现在我们来想想,既然我们是给document绑定的click事件,为什么点击button会触发click事件呢? 那我们就要说说button与document的关系了。document是表示当前的html文档,而所有的html元素都是在存在html文档里面的吧!(比如body,div,button,input 等等) //我们之前有学过冒泡,当子元素,与父元素同时绑定同一事件的时候,点击子元素的时候会冒泡到父元素。当我们点击页面上的任何元素的的时候其实是最终都会冒泡到了document上。 //所以当我们点击了button的时候其实也是冒泡到了document上。所以当我们点击button的时候弹出了“点击了” 【注:页面元素首先冒泡到body,然后再冒泡到document】 //其实这上这段代码与以下这段代码等同(这是我个人猜测) $(document).click(function (e) { if (e.type == "click" && e.target == "[object HTMLButtonElement]") { alert("点击了"); } }) $("button").die("click"); //删除这个委托。当点击button元素的时候就不在委托document去触发click事件了。 //--------------------------------------------------live()的替代方法delegate() //由于.live()和.die()在jQuery1.4.3 版本中废弃了,之后推出语义清晰、减少冒泡传播层次、又支持链接链式调用方式的方法:delegate()和undelegate()。 //因为live()是直接给document绑定事件的,那么从子元素冒泡到父元素,再从父元素冒泡到body,再从body冒泡到document 传播的层次比较多,比较冗余。 //2,live()无法使用链式调用(因为参数特性导致) (链式调用其实就是杨中科说的链式编程) //delegate()已经不再像live()那样直接将document绑定事件了,因为从子元素冒泡到父元素,再从父元素冒泡到body,在从body冒泡到document。传递的层次比较多。 //delegate是直接给你要点击元素的父元素绑定事件 $("#box").delegate("input", "click", function () {//delegate()的第一个参数表示我要点击的元素,第二个参数表示要绑定的事件,第三个参数是处理函数。 alert("点击了") //这段代码的意思是将#box元素绑定click事件,当点击input元素的时候触发事件。然后调用匿名函数进行处理。 }) $("#box").undelegate("input", "click"); //删除这个委托。当点击input这个元素的时候就不在委托#box元素去触发click事件了。 //*****************************以上都是原理。上面的方法都已经被抛弃掉了。****************************************** //===================================【on()取代bind() off()取代unbind】=============================================// //主角上场了------------------------------------------------------------ on(), off(),one() //on()可以完全取代bind() ,off完全可以取代unbind() 看下面的代码: $("body").click(function () { alert("用于演示事件冒泡【body】") }); $(document).click(function () { alert("用于演示事件冒泡【document】") }) //------------------------------------------- $("button").on("click", function () { //将button绑定click事件 alert("普通绑定,取代bind") }) //------------------------------------------- $("button").on("click", function (e) { e.stopPropagation(); //取消button触发的事件冒泡; }) //------------------------------------------- $("a").on("click",function (e) { e.preventDefault(); //取消a触发的click事件的默认行为。主要表现在点击超链接的时候不在有跳转的功能了。(注:这里仅仅去阻止了a的默认行为,但是没有阻止a触发click事件冒泡,所以点击a的时候会弹出“用于演示事件冒泡【body】”和“用于演示事件冒泡【document】”) }) //------------------------------------------- $("a").on("click",function (e) { return false; //既阻止a触发click事件冒泡,也阻止a触发click事件的默认行为。 }) //------------------------------------------- //如果说触发事件的调用函数没有除"return fase"外任何代码,我们仅仅是想阻止事件冒泡和阻止事件的默认行为。我们也可以简写。如下: $("a").on("click", false); $("a").off("click"); //移除a标签绑定的click事件。 //------------------------------------------- function f1(e) { alert("我是f1"); } $("a").on("click", f1); //给a标签绑定click事件,click事件的处理函数是f1 $("a").off("click", f1); //删除a标签上绑定f1函数的click事件 (即:假如我a标签绑定了click事件,如果这个事件的处理函数是f1,那么就删除这个click事件) //注意:这里仅仅是删除了调用f1做处理函数的click事件。 //===================================【on()取代delegate() off()取代undelegate()】=============================================// //on() 取到 delegate() off取代 undelegate() 【注:one()可以取代bind()也可也取代delegate()】 //如果用on()来取代delegate()的时候。on()和delegate()一样,都是通过给父元素绑定事件的方式来实现的。 //------------------------------------------- $("#box").on("click", "input", function () { $(this).clone().appendTo("#box"); //你点击谁,谁就是$(this); 因为这里是要你点击input来触发click事件,所以克隆的是input }) $("#box").off("click", "input"); //删除委托,当点击input这个按钮的时候,就不在委托父元素#box去触发click事件了。 //------------------------------------------- function f2() { alert("我是f2"); }; $("#box").on("click", "input", f2); $("#box").off("click", "input", f2);//删除委托;当点击input这个按钮的时候,如果触发的事件click的处理函数是f2,就删除这个委托,也就是就不在委托父元素#box去触发click事件,即不再调用f2这个函数了。 //------------------------------------------- $("#box").on("click", "input",{ user: "张三" } ,function (e) { alert(e.data.user); //打印出:张三 }) $("#box").off("click", "input");//删除委托; 当点击input的时候不在委托父元素#box触发click事件。 //===================================【one()只执行一次的绑定,或委托】=========================================// //下面我们再来说说这个one() 简单的来说,one()是指执行一次的事件绑定 //不管是.bind()还是.on(),绑定事件后都不是自动移除事件的,需要通过.unbind()和.off()来手工移除。jQuery 提供了.one()方法,绑定元素执行完毕后自动移除事件,可以方法仅触发一次的事件。 //普通绑定 $("input").one("click", function () { //只执行一次的事件触发 alert("我只执行一次"); }) //委托 $("#box").one("click", "input", function () { alert("只委托一次"); }) </script>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。