修复 jQuery 中 isFunction 方法的 BUG

作者:怿飞 来源:怿飞blog 时间:2010-01-25 12:05:00 

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 方法等)。

为什么会这样呢?

详细看测试页面:http://www.planabc.net/demo/isfunction/

会发现在 IE 下用 typeof 检测 alert、confirm 方法以及 DOM 的方法显示 object,而其他浏览器下显示 function。

那如何完善这个问题呢?

  1. typeof 检测某个方法(例如:document.getElementById) 是否是 object,如何是,则重写 isFunction 函数;

  2. 怎样重写呢?正则判断传入的对象字符串后(”" + fn),是否起始位置含有 function,即:/^\s*\bfunction\b/.test(” + fn)。

OK,看下根据以上思路修改后的 isFunction 函数:

var isFunction = (function() {
    // Performance optimization: Lazy Function Definition
    return "object"  === typeof document.getElementById ?
           isFunction = function(fn){
                try {
                    return /^\s*\bfunction\b/.test("" + fn);
                } catch (x) {
                    return false
                }
           }:
           isFunction = function(fn){
               return "[object Function]" === Object.prototype.toString.call(fn);
           };
})()

参考阅读:

标签:jquery,isfunction,bug
0
投稿

猜你喜欢

  • 该用多大的字

    2009-05-17 14:39:00
  • getElementsByAttribute

    2009-10-27 12:13:00
  • javascript面向对象技术基础(三)

    2010-02-07 13:11:00
  • 利用XMLBean轻轻松松读写XML

    2008-09-04 11:25:00
  • asp的command对象的使用

    2008-06-23 13:03:00
  • 通过T_sql语句向其中一次填入一条数据或一次填入多条数据的方式填充数据

    2012-11-30 19:55:34
  • XML HttpRequst对象学习

    2007-10-12 19:04:00
  • MySQL高级查询方法之记录查询

    2010-06-20 14:48:00
  • 网址站的2.0玩法

    2010-03-15 12:25:00
  • sql分类汇总及Select的自增长脚本

    2012-07-21 14:40:14
  • 标签明晰、有效

    2010-01-18 12:22:00
  • 教你快速掌握SQL语言中游标的使用技巧

    2009-01-08 16:24:00
  • 如何正确处理数据库中的Null

    2007-09-30 19:41:00
  • asp从Excel中筛选符合条件的记录保存至新的Excel中

    2007-09-06 19:20:00
  • 一个简单的像素画小工具

    2010-01-01 15:33:00
  • 设计较好付款流程的12个建议

    2009-06-08 12:45:00
  • 注册表单的规则——读《Patterns for Sign Up &Ramp Up》

    2008-07-17 12:51:00
  • Mootools 1.2教程(1)——MooTools介绍

    2008-11-12 13:01:00
  • CSS网页布局开发时的常见问题小结

    2009-08-13 12:17:00
  • 实例讲解Oracle到SQL Server主键迁移

    2009-03-25 13:30:00
  • asp之家 网络编程 m.aspxhome.com