为什么这个$ .isFunction返回false?

时间:2012-10-25 11:54:54

标签: jquery

我创建了一个jquery函数,但是如果函数名在字符串中,$ .isFunction似乎总是返回false。

(function( $ ) {
    $.myTest = function() {
       return true;
    }
})( jQuery );

alert($.isFunction('$.myTest'));

小提琴:here

注意:如果我删除引号(例如。alert($.isFunction($.myTest));,它会起作用,但我的函数在字符串中。

修改

这个函数名在一个字符串里面,因为我创建了一个插件来从dom元素中的参数创建ajax。例如:

        data-route="xxx.php"
        data-lock=".buttonsToLock"
        data-output="#outputContainer"
        data-callback-after="$.myTest"

但我无法检查data-callback-after是否为现有功能。

有什么想法吗?

由于

3 个答案:

答案 0 :(得分:6)

您应始终将对象传递给$.isFunction()方法:

alert($.isFunction($.myTest));

否则,您将始终收到false,因为默认情况下字符串不是函数

答案 1 :(得分:2)

函数将存储在window中,因此您可以尝试这样的事情:

$.isFunction(window['myTest']);

但是,既然你正在使用“命名空间”,你需要这样做:

$.isFunction(window['$']['myTest']);

或者您可以使用此功能:

function isFunctionByName(functionName, context) {
  var namespaces = functionName.split(".");
  var func = namespaces.pop();
  for(var i = 0; i < namespaces.length; i++) {
    context = context[namespaces[i]];
  }
  return $.isFunction(context[func]);
}

alert(isFunctionByName("$.myTest", window));

http://jsfiddle.net/JqCzH/2/

答案 2 :(得分:1)

看起来你试图动态调用函数/回调。

您应该考虑以下方法。

    (function( $ ) {
        window.myTest = function() {
           return true;
        }
    })( jQuery );

var data-route="xxx.php",
    data-lock=".buttonsToLock",
    data-output="#outputContainer",
    data-callback-after="myTest";

    // To run the function 
    window[data-callback-after]();

    // To test the function
    $.isFunction(window[data-callback-after]);