如何在事件代理中正确使用 focus 和 blur 事件

什么是事件代理(Event Delegation)? 如果不太了解的朋友,可详细阅读:《Event delegation in JavaScript》,这里不再累述。 首先让我们一起来回顾一些常识: 通常支持事件冒泡(Event Bubbling)的事件类型为鼠标事件和键盘事件,例如:mouseover, mouseout, click, keydown, keypress。 接口事件则通常不支持事件冒泡(Event Bubbling),例如:load, change, submit, focus, blur。 很明显:focus 和 blur 都属于不支持冒泡的接口事件。既然都不支持冒泡,那又如何实现事件代理呢? 可以换个角度,逆向思维,尝试事件捕获(Event Capturing,除了IE,现在流行的标准浏览器均支持)。 测试后会发现,如果你捕获 focus 或 blur 事件,目标元素的祖先元素均执行事件函数。至于为什么?或许是实现的一个 BUG。 el.addEventListener(‘focus’, focusHandler, true); el.addEventListener(‘blur’, blur... 23 条评论 »

修复 jQuery 中 isFunction 方法的 BUG

jQuery 1.4 源码 449 行(core.js 431 行),判断是否为函数的方法如下(思路来源于 Douglas Crockford 的《The Miller Device》): isFunction: function( obj ) { return toString.call(obj) === “[object Function]”; }, 同时 jQuery 的作者也作了部分注释: See test/unit/core.js for details concerning isFunction. Since version 1.3, DOM methods and functions like alert aren’t supported. They return false on IE (#2968). 即:此方法在 IE 下无法正确识别 DOM 方法和一些函数(例如 alert […]

... 13 条评论 »

如何将函数的实际参数转换成数组

实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。 值得庆幸的是,我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组: var args = Array.prototype.slice.call(arguments, 0); 对于slice 方法,ECMAScript 262 中 15.4.4.10 Array.prototype.slice (start, end) 章节有备注: The slice function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects […]

... 26 条评论 »