5-3 事件接口
本节编程练习不计算学习进度,请电脑登录imooc.com操作

事件接口

jQuery事件处理机制能帮我们处理那些问题?

毋容置疑首先要解决浏览器事件兼容问题:

1. 可以在一个事件类型上添加多个事件处理函数,可以一次添加多个事件类型的事件处理函数
2. 提供了常用事件的便捷方法
3. 支持自定义事件
4. 扩展了组合事件
5. 提供了统一的事件封装、绑定、执行、销毁机制

……

为了更深入的理解幕后的实现,所以先整理整体的结构思路,从1.7后就去除了 live 绑定,所以现在的整个事件的 API

如图:

jQuery的事件绑定有多个方法可以调用,以 click 事件来举例:

$('#foo').click(function(){ })
$('#foo').bind('click',function(){ })
$("foo").delegate("td", "click", function() { })
$("foo").on("click", "td", function() { })

click,bind,delegate,on方法,以上四种绑定都能达到同一样的效果,但是各自又有什么区别,内部又是如何实现?

源码分析

click方式

jQuery.fn[ 'click' ] = function( data, fn ) {
    return arguments.length > 0 ?
         this.on( name, null, data, fn ) :
         this.trigger( name );
};

源码很简单,合并15种事件统一增加到jQuery.fn上,内部调用this.on / this.trigger。

bind方式

bind: function( types, data, fn ) {
    return this.on( types, null, data, fn )
}

同样调用的this.on/this.off。

delegate方式

delegate: function( selector, types, data, fn ) {
    return this.on( types, selector, data, fn )
}

同样调用的this.on/this.off。

one方式

one: function( types, selector, data, fn ) {
    return this.on( types, selector, data, fn, 1 )
}

可见以上的接口只是修改了不同的传递参数,最后都交给 on 实现的。

任务

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
  5. <style>
  6. p { background:yellow; font-weight:bold; cursor:pointer;
  7. padding:5px; }
  8. p.over { background: #ccc; }
  9. span { color:red; }
  10. </style>
  11. <script src="http://www.imooc.com/static/lib/jquery/1.9.1/jquery.js" type="text/javascript"></script>
  12. </head>
  13. <body>
  14.  
  15.  
  16. <script>
  17.  
  18. ////////////
  19. //事件方法的接口 //
  20. ////////////
  21. jQuery.fn.extend({
  22. hover: function(fnOver, fnOut) {
  23. return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
  24. },
  25.  
  26. bind: function(types, data, fn) {
  27. return this.on(types, null, data, fn);
  28. },
  29. unbind: function(types, fn) {
  30. return this.off(types, null, fn);
  31. },
  32.  
  33. delegate: function(selector, types, data, fn) {
  34. return this.on(types, selector, data, fn);
  35. },
  36. undelegate: function(selector, types, fn) {
  37. // ( namespace ) or ( selector, types [, fn] )
  38. return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
  39. }
  40. });
  41.  
  42. </script>
  43.  
  44. </body>
  45. </html>
下一节