2012-10-25 186 views
0

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

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

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

小提琴:here

注意:如果删除引号(如alert($.isFunction($.myTest));,它的工作原理,但我的函数是一个字符串中

编辑

该功能的名称是一个字符串里面,因为我创建一个插件,使AJAX从DOM元素中的参数,例如:。

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

但我无法检查data-callback-after是现有的功能

有什么想法?

感谢

+2

为什么或如何在一个字符串中的函数。你应该解释, – Blowsie

+0

好吧,我编辑我的问题。 –

+0

@Ninsuo然后,你需要安全地评估你的字符串的对象值,并使用'$ .isFunction()'。 – VisioN

回答

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]); 
+0

谢谢,我正在寻找。 –

6

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

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

否则,你将永远收到false,因为字符串不是默认的功能

+0

请从头到尾阅读这个问题......这并没有回答我。不管怎么说,还是要谢谢你。 –

+2

看起来像我的合法答案 – Blowsie

+0

从技术上讲,它可以与字符串一起工作。它告诉你一个字符串不是一个函数。 – Quentin

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/

+1

不错的方式来做一个通用的方式,谢谢 –

相关问题