2011-08-09 201 views
1

我需要一個函數來檢查jQuery中的函數是否存在,如果是,那麼應該調用這個函數。如果我用一個簡單的名字使用下面的代碼,但是如果我想動態地檢查一個函數是否存在,它不起作用。有沒有人有想法?檢查功能是否動態存在

function homeController() { 
    console.log('in the homecontroller'); 
} 

$('div[class="view"]').each(function() { 
     $('#' + this.id).live('pageshow', function() { 
      var func = this.id + 'Controller';    
      if($.isFunction(func)) { 
       console.log('jquery exists'); 
      } 
     }); 
    }); 
+0

你的意思是你想測試任意JavaScript函數是否在範圍內?當然'func'在你的例子中只是一個字符串,而不是一個函數。 –

回答

3

使用jQuery.isFunction()方法來檢查對象是否是一個函數或沒有。

$('div[class="view"]').each(function() { 
     $('#' + this.id).live('pageshow', function() { 
      var func = eval(this.id + 'Controller');    
      if($.isFunction(func)) { 
       console.log('jquery exists'); 
      } 
     }); 
    }); 
1

我認爲你需要使用eval的,因爲你的func是一個字符串。

var func = eval(this.id + 'Controller'); 
if($.isFunction(func)) { 
    func(); 
} 
+0

如果我使用''eval'',它將執行該函數並在函數不存在時拋出錯誤,所以我需要另一種方式。 –

+0

如果你沒有在末尾加上括號'()',它將不會執行,只會得到它的值。 – jcubic

+0

我不會在最後加上括號,但我仍然在我的情況下得到一個錯誤「listController」未定義。 –

0

你需要弄清楚你的函數是在範圍(或者換句話說,它的對象是你的函數的性質),然後用

if ($.isFunction(scope[func])) { 
    ... 
} 

將名稱轉換所需要的函數轉換爲當前範圍內對該函數的引用。

這當然假設你的功能實際上是的一些範圍。

因此,如果您的homeController()函數已在全局範圍內聲明,它將是全局對象的一個​​屬性。

但是,如果他們剛剛被聲明爲其他閉包內的內部函數,他們將不會有一個。

1

$ .isFunction - 「確定傳遞的參數是否是Javascript函數對象」。顯然,你正在傳遞一個字符串。

如果你想檢查jQuery插件不是使用

if (typeof jQuery[yourFunctionName] == 'function') { .. 

和一般的JavaScript函數 -

if(typeof window[yourFunctionName] == 'function') { .. 
0
function doIt(callback) { 

    console.log('Did it'); 

    typeof callback === 'function' && callback(); 

} 

這隻有在函數存在執行回調。您可以從該功能中拉出該線並在任何地方使用。