2012-10-25 64 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

不錯的方式來做一個通用的方式,謝謝 –