JQuery中Bind()事件用法分析

1
.bind( eventType [, eventData], handler(eventObject))

.Bind()方法的主要功能是在向它绑定的对象上面提供一些事件方法的行为。期中它的三个参数的意义分别如下:

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 等等。

eventData参数是一个可选参数,不过它在平时用的比较少。如果提供了这个参数,那么我们就能把一些附加信息传递给事件处理函数了。这个参数有个很好的用处,就是处理闭包带来的问题。待会在给大家举实例。

Handler是用来绑定的处理数,其实也也就是回调函数,处理完数据之后相应的方法。

1.第一个简单的bind ()事件---Hello Word

?
1
2
3
4
5
6
7
8
<input id= "BtnFirst" type= "button" value= "Click Me" />
<script>
$( function () {
  $( "#BtnFirst" ).bind( "click" , function (){
   alert( "Hello World" );
  });
})
</script>

打开页面之后,点击按钮“Click Me”,就会弹出”Hello World”。这算是我们最简单的绑定事件吧。很简单吧。

2.绑定多个事件

我们可以通过bind()来绑定多个事件(其实,这也就是JQuery以及Linq中非常有名的链式编程)。实现的主要功能就是当我们点击的时候,弹出“Hello World”,当离开button的时候,显示出一个div。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<div>
<input id= "BtnFirst" type= "button" value= "Click Me" /></div>
<div id= "TestDiv" style= " width:200px; height:200px; display:none; " >
</div>
<script>
$( function () {
  $( "#BtnFirst" ).bind( "click" , function () {
   alert( "Hello World" );
  }).bind( "mouseout" , function () {
   $( "#TestDiv" ).show( "slow" );
  });
})
</script>

这段代码页很容易理解,就是当button被点击的时候,弹出一个"Hello World",在离开的时候,在把div给显示出来。JQuery里的动画,均可以用“slow”、“fast”和“normal”,当然你还可以设置相关的毫秒数。

3.bind()事件的对象

Handler这个回调函数可以接受一个参数,当这个函数被调用时,一个JavaScript事件对象会作为一个参数传进来。

这个事件对象通常是没有必要且可以省略的参数,因为当这个事件处理函数绑定的时候就能够明确知道他在触发的时候应该做些什么,通常就已经可以获得充分的信息了。然而在有些时候,在事件初始化的时候需要获取更多关于用户环境的信息。

给一个JQuery官网上面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<style>
  p {background:yellow;font-weight:bold;cursor:pointer;3 padding:5px;}
  p.over {background: #ccc;}
  span {color:red;}
</style>
<p>Click or double click here.</p>
<span></span>
<script>
  $( "p" ).bind( "click" , function (event){
   var str = "( " + event.pageX + ", " + event.pageY + " )" ;
   $( "span" ).text( "Click happened! " + str);
  });
  $( "p" ).bind( "dblclick" , function (){
   $( "span" ).text( "Double-click happened in " + this .nodeName);
  });
  $( "p" ).bind( "mouseenter mouseleave" , function (event){
   $( this ).toggleClass( "over" );
  });
</script>

这里的主要功能是为了实现当用户点击p这个对象的时候,把当前相对于页面的坐标显示在span标签里面,这里就用到了event这个事件。把参数传进去。

4.unbind()事件

unbind([type],[data],Handler) 是 bind()的反向操作,从每一个匹配的元素中删除绑定的事件。如果没有参数,则删除所有绑定的事件。你可以将你用bind()注册的自定义事件取消绑 定。如果提供了事件类型作为参数,则只删除该类型的绑定事件。如果把在绑定时传递的处理函数作为第二个参数,则只有这个特定的事件处理函数会被删除。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<body onclick= "MyBodyClick()" >
  <div onclick= "MyClickOut()" >
   <div onclick= "MyClickInner()" >
    <span id= "MySpan" >I love JQuery!! </span>
   </div>
  </div>
  <span id= "LooseFocus" >失去焦点</span>
</body>
<script>
function MyClickOut() {
  alert( "outer Div" );
}
function MyClickInner() {
  alert( "Inner Div" );
}
function MyBodyClick() {
  alert( "Body Click" );
}
var foo = function () {
  alert( "I'm span." );
}
$( function () {
  $( "#MySpan" ).bind( "click" , foo);
}) 
$( function () {
  $( "#LooseFocus" ).unbind( "click" , foo);
})
</script>

上面的代码也很好理解,就是当用户的鼠标在span上面停留的时候,然后把span的click事件给取消掉。所以,最后它只会弹出body里面的alert。

最后,简单的了解一下one()事件的使用,其实one和bind是一样,都是为了绑定事件而产生的。One与bind基本上差不多,不同的在调用 jQuery.event.add时,把注册的事件处理的函数做了一个小小的调整。One调用了jQuery.event.proxy进行了代理传入的事 件处理函数。在事件触发调用这个代理的函数时,先把事件从cache中删除,再执行注册的事件函数。这里就是闭包的应用,通过闭包得到fn注册的事件函数 的引用。 

使用规则:

?
1
one(type,[data],fn)

为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数。 在每个对象上,这个事件处理函数只会被执行一次。其他规则与bind()函数相同。这个事件处理函数会接收到一个事件对象,可以通过它来阻止(浏览器)默认的行为。如果既想取消默认的行为,又想阻止事件起泡,这个事件处理函数必须返回false。

贴一下,bind和one的各自代码的实现,看官可以稍微的做一个比较:

Bind()代码的实现:

?
1
2
3
4
5
6
bind : function (type, data, fn) {
  return type == "unload" ? this .one(type,data,fn) : this .each( function (){
  //fn || data, fn && data实现了data参数可有可无
   jQuery.event.add( this , type, fn || data, fn && data);
  });
}

One()代码的实现:

?
1
2
3
4
5
6
7
8
9
10
one : function (type, data, fn) {
  var one = jQuery.event.proxy(fn || data, function (event) {
   jQuery( this ).unbind(event, one);
   return (fn || data).apply( this , arguments);
  //this->当前的元素
  });
  return this .each( function () {
   jQuery.event.add( this , type, one, fn && data);
  });
}

5.最后呢,其实想在贴一个冒泡事件,因为在处理绑定事件的时候,如果调用内部的事件 有可能会触发外面的事件,所以给大伙一个借鉴吧。

这里可以参考一下javascript事件冒泡的文章:《JavaScript 事件冒泡简介及应用》。

简单的说,何为冒泡事件?其实,简单的理解是,也可以说是事件传播,它会从内部的控件广播到父类的元素,然后接着一直往上到祖先级别的元素。

则 冒泡实例代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<body onclick= "MyBodyClick()" >
  <div onclick= "MyClickOut()" >
   <div onclick= "MyClickInner()" >
     <span id= "MySpan" >
      I love JQuery!!
     </span>
   </div>
  </div>
</body>
<script type= "text/javascript" >
  function MyClickOut() {
   alert( "outer Div" );
  }
  function MyClickInner() {
   alert( "Inner Div" );
  }
  function MyBodyClick() {   
   alert( "Body Click" );
  }
  $( function () {
   $( "#MySpan" ).bind( "click" , function (event) {
    alert( "I'm span" );
    event.stopPropagation();
  });
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值