随着如今JQuery这个javascript的愈来愈强大,在咱们日常的前端UI开发,若是不使用JQuery,说明你已经很out了。今天咱们来学习一下 JQuery的bind事件。虽然,这个话题被不少写了不少,但我仍是想本身在这里班门弄斧一下,但愿各位看官不要喷。若是有什么意见,能够直接进行交流,共同进步。 javascript
JQuery 官网的Bind事件的API吧:地址链接。若是各位有兴趣看洋文的,但是去看看。 html
刚开始咱们先看一下它的定义: 前端
.bind( eventType [, eventData], handler(eventObject)) java
.Bind()方法的主要功能是在向它绑定的对象上面提供一些事件方法的行为。期中它的三个参数的意义分别以下: node
eventType是一个字符串类型的事件类型,就是你所须要绑定的事件。这类类型能够包括以下:blur, focus, focusin, focusout, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error 。这里须要注意的是,这里用的都是javascript里面的事件方法,而不是JQuery里面的,JQuery里面的事件方法均在JavaScript前面多了一个“on”,好比onclick,onblur 等等。 jquery
eventData参数是一个可选参数,不过它在平时用的比较少。若是提供了这个参数,那么咱们就能把一些附加信息传递给事件处理函数了。这个参数有个很好的用处,就是处理闭包带来的问题。待会在给你们举实例。 编程
Handler是用来绑定的处理函数,其实也也就是回调函数,处理完数据以后相应的方法。 api
图一: jquery里的bind参数提示 浏览器
1.第一个简单的bind ()事件---Hello Word 闭包
Html Code:
1 <input id="BtnFirst"type="button"value="Click Me"/>
JavaScript Code:
1 $(function () { 2 $("#BtnFirst").bind("click", function () { 3 alert("Hello World"); 4 }); 5 })
打开页面以后,点击按钮“Click Me”,就会弹出”Hello World”。这算是咱们最简单的绑定事件吧。很简单吧。
2.绑定多个事件
咱们能够经过bind()来绑定多个事件(其实,这也就是JQuery以及Linq中很是有名的链式编程)。实现的主要功能就是当咱们点击的时候,弹出“Hello World”,当离开button的时候,显示出一个div。
Html Code:
1 <div> 2 <input id="BtnFirst"type="button"value="Click Me"/></div> 3 <div id="TestDiv"style=" width:200px; height:200px; display:none; background-color:Red;"> 4 </div>
JavaScript Code:
1 $(function () { 2 $("#BtnFirst").bind("click", function () { 3 alert("Hello World"); 4 }).bind("mouseout", function () { 5 $("#TestDiv").show("slow"); 6 }); 7 })
这段代码页很容易理解,就是当button被点击的时候,弹出一个"Hello World",在离开的时候,在把div给显示出来。JQuery里的动画,都可以用“slow”、“fast”和“normal”,固然你还能够设置相关的毫秒数。
3.bind()事件的对象
Handler这个回调函数能够接受一个参数,当这个函数被调用时,一个JavaScript事件对象会做为一个参数传进来。
这个事件对象一般是没有必要且能够省略的参数,由于当这个事件处理函数绑定的时候就可以明确知道他在触发的时候应该作些什么,一般就已经能够得到充分的信息了。然而在有些时候,在事件初始化的时候须要获取更多关于用户环境的信息。
给一个JQuery官网上面的例子:
Css Code:
1 <style> 2 p {background:yellow;font-weight:bold;cursor:pointer;3 padding:5px;} 4 p.over {background:#ccc;} 5 span {color:red;} 6 </style>
Html Code:
1 <p>Click or double click here.</p> 2 <span></span>
JavaScript Code:
1 <script> 2 $("p").bind("click", function(event){ 3 var str = "( " + event.pageX + ", " + event.pageY + " )"; 4 $("span").text("Click happened! " + str); 5 }); 6 $("p").bind("dblclick", function(){ 7 $("span").text("Double-click happened in " + this.nodeName); 8 }); 9 $("p").bind("mouseenter mouseleave", function(event){ 10 $(this).toggleClass("over"); 11 }); 12 13 </script>
这里的主要功能是为了实现当用户点击p这个对象的时候,把当前相对于页面的坐标显示在span标签里面,这里就用到了event这个事件。把参数传进去。
4.unbind()事件
unbind([type],[data],Handler) 是 bind()的反向操做,从每个匹配的元素中删除绑定的事件。若是没有参数,则删除全部绑定的事件。你能够将你用bind()注册的自定义事件取消绑定。若是提供了事件类型做为参数,则只删除该类型的绑定事件。若是把在绑定时传递的处理函数做为第二个参数,则只有这个特定的事件处理函数会被删除。
Html Code:
1 <body onclick="MyBodyClick()"> 2 <div onclick="MyClickOut()"> 3 <div onclick="MyClickInner()"> 4 <span id="MySpan">I love JQuery!! </span> 5 </div> 6 </div> 7 <span id="LooseFocus">失去焦点</span> 8 </body>
JavaScript Code:
1 function MyClickOut() { 2 alert("outer Div"); 3 } 4 function MyClickInner() { 5 alert("Inner Div"); 6 } 7 function MyBodyClick() { 8 alert("Body Click"); 9 } 10 var foo = function () { 11 alert("I'm span."); 12 } 13 $(function () { 14 $("#MySpan").bind("click", foo); 15 }) 16 $(function () { 17 $("#LooseFocus").unbind("click", foo); 18 })
上面的代码也很好理解,就是当用户的鼠标在span上面停留的时候,而后把span的click事件给取消掉。因此,最后它只会弹出body里面的alert。
最后,简单的了解一下one()事件的使用,其实one和bind是同样,都是为了绑定事件而产生的。One与bind基本上差很少,不一样的在调用jQuery.event.add时,把注册的事件处理的函数作了一个小小的调整。One调用了jQuery.event.proxy进行了代理传入的事件处理函数。在事件触发调用这个代理的函数时,先把事件从cache中删除,再执行注册的事件函数。这里就是闭包的应用,经过闭包获得fn注册的事件函数的引用。
使用规则: one(type,[data],fn)
为每个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数。 在每一个对象上,这个事件处理函数只会被执行一次。其余规则与bind()函数相同。这个事件处理函数会接收到一个事件对象,能够经过它来阻止(浏览器)默认的行为。若是既想取消默认的行为,又想阻止事件起泡,这个事件处理函数必须返回false。
贴一下,bind和one的各自代码的实现,看官能够稍微的作一个比较:
Bind()代码的实现:
1 bind : function(type, data, fn) { 2 return type == "unload" ? this.one(type, data, fn) : this 3 .each(function() {//fn || data, fn && data实现了data参数无关紧要 4 jQuery.event.add(this, type, fn || data, fn && data); 5 }); },
One() 代码的实现:
1 one : function(type, data, fn) { 2 var one = jQuery.event.proxy(fn || data, function(event) { 3 jQuery(this).unbind(event, one); 4 return (fn || data).apply(this, arguments);/this->当前的元素 5 }); 6 return this.each(function() { 7 jQuery.event.add(this, type, one, fn && data); 8 }); 9 },
5.最后呢,其实想在贴一个冒泡事件,由于在处理绑定事件的时候,若是调用内部的事件 有可能会触发外面的事件,因此给大伙一个借鉴吧。
javascript事件冒泡的文章:http://www.2cto.com/kf/201111/110252.html
简单的说,何为冒泡事件?其实,简单的理解是,也能够说是事件传播,它会从内部的控件广播到父类的元素,而后接着一直往上到祖先级别的元素。
则 冒泡实例代码:
Html Code:
1 <body onclick="MyBodyClick()"> 2 <div onclick="MyClickOut()"> 3 <div onclick="MyClickInner()"> 4 <span id="MySpan"> 5 I love JQuery!! 6 </span> 7 </div> 8 </div> 9 </div> 10 </body>
JavaScript Code:
1 <script type="text/javascript"> 2 function MyClickOut() { 3 alert("outer Div"); 4 } 5 function MyClickInner() { 6 alert("Inner Div"); 7 } 8 function MyBodyClick() { 9 alert("Body Click"); 10 } 11 12 $(function () { 13 $("#MySpan").bind("click", function (event) { 14 alert("I'm span"); 15 event.stopPropagation(); 16 }); 17 </script>
因此,当你点击最里面的span的时候,外面的div依次的触发 知道body里。 我粗劣的画了一个图,以下:
完毕,由于这篇博客写了整理了好几天,虽然有些地方很easy,不过若是很差,请你们斧正。就当作一个笔记吧。
编码常识:
if(0){alert(0)} 始终是假始终是真