日期:2014-05-16  浏览次数:20321 次

10个最常用的JavaScript自定义函数

Java Script自定义函数在平时的开发过程中比较实用,这里介绍的是个最常用的十个JavaScript自定义函数主要涉及添加事件与移除事件等等。

(10)addEvent

网上最流行的版本是Scott Andrew的,据说javascript界曾举行一场比赛(此事件我们可以在Pro Javascript Techniques第100页看到)或浏览PPK的网站,征求添加事件与移除事件的函数,他就是其获奖者。下面就是他的实现:

  1. function addEvent(elm, evType, fn, useCapture) { ?
  2. ?if (elm.addEventListener) {? ?
  3. ? elm.addEventListener(evType, fn, useCapture);//DOM2.0? ?
  4. ? return true;? ?
  5. ?}? ?
  6. ?else if (elm.attachEvent) {? ?
  7. ? var r = elm.attachEvent('on' + evType, fn);//IE5+? ?
  8. ? return r;? ?
  9. ?}? ?
  10. ?else {? ?
  11. ? elm['on' + evType] = fn;//DOM 0? ?
  12. ?}? ?
  13. }

下面是Dean Edwards 的版本

  1. // addEvent/removeEvent written by Dean Edwards, 2005 ?
  2. // with input from Tino Zijdel ?
  3. // http://dean.edwards.name/weblog/2005/10/add-event/ ?
  4. function addEvent(element, type, handler) { ?
  5. ? //为每一个事件处理函数分派一个唯一的ID? ?
  6. ? if (!handler.$guid) handler.$guid = addEvent.guid++;? ?
  7. ? //为元素的事件类型创建一个哈希表? ?
  8. ? if (!element.events) element.events = {};? ?
  9. ? //为每一个"元素/事件"对创建一个事件处理程序的哈希表? ?
  10. ? var handlers = element.events[type];? ?
  11. ? if (!handlers) {? ?
  12. ?? ???handlers = element.events[type] = {};? ?
  13. ?? ???//存储存在的事件处理函数(如果有)? ?
  14. ?? ???if (element["on" + type]) {? ?
  15. ?? ?? ?? ?handlers[0] = element["on" + type];? ?
  16. ?? ???}? ?
  17. ? }? ?
  18. ? //将事件处理函数存入哈希表? ?
  19. ? handlers[handler.$guid] = handler;? ?
  20. ? //指派一个全局的事件处理函数来做所有的工作? ?
  21. ? element["on" + type] = handleEvent;? ?
  22. }; ?
  23. //用来创建唯一的ID的计数器 ?
  24. addEvent.guid = 1; ?
  25. function removeEvent(element, type, handler) { ?
  26. ? //从哈希表中删除事件处理函数? ?
  27. ? if (element.events && element.events[type]) {? ?
  28. ?? ???delete element.events[type][handler.$guid];? ?
  29. ? }? ?
  30. }; ?
  31. function handleEvent(event) { ?
  32. ? var returnValue = true;? ?
  33. ? //抓获事件对象(IE使用全局事件对象)? ?
  34. ? event = event || fixEvent(window.event);? ?
  35. ? //取得事件处理函数的哈希表的引用? ?
  36. ? var handlers = this.events[event.type];? ?
  37. ? //执行每一个处理函数? ?
  38. ? for (var i in handlers) {? ?
  39. ?? ? this.$handleEvent = handlers[i];? ?
  40. ?? ???if (this.$handleEvent(event) === false) {? ?
  41. ?? ?? ???returnValue = false;? ?
  42. ?? ???}? ???}? ?
  43. ? return returnValue;? ?
  44. }; ?
  45. //为IE的事件对象添加一些“缺失的”函数 ?
  46. function fixEvent(event) { ?
  47. ? //添加标准的W3C方法? ?
  48. ? event.preventDefault = fixEvent.preventDefault;? ?
  49. ? event.stopPropagation = fixEvent.stopPropagation;? ?
  50. ? return event;? ?
  51. }; ?
  52. fixEvent.preventDefault = function() { ?
  53. ? this.returnValue = false;? ?
  54. }; ?
  55. fixEvent.stopPropagation = function() { ?
  56. ? this.cancelBubble = true;? ?
  57. };

功能非常强悍,解决IE的this指向问题 ,event总是作为第一个参数传入,跨浏览器就更不在话下。

另,我还珍藏了一个HTML5工作组的版本:

  1. var addEvent=(function(){ ?
  2. ? if(document.addEventListener){? ?
  3. ?? ???return function(el,type,fn){? ?
  4. ?? ?? ?? ?if(el.length){? ?
  5. ?? ?? ?? ?? ? for(var i=0;i??
  6. ?? ?? ?? ?? ?? ???addEvent(el[i],type,fn);? ?