2013-03-18 42 views
4

我正在嘗試根據我正在與之交互的元素的類來調用其他函數。jQuery:使用變量作爲函數名稱

我想能夠使用一個元素的類來調用一個函數,而不是使用if語句。下面的示例:

function validate(thisInput){ 
    var thisClass = thisInput.attr("class").split(' ')[0]; 
    validate + class(thisInput); 
    /*This is what I would like to happen: 
    the class is grabbed from above, then that class name (whatever it is) 
    calls it's own function. I will be creating a function for each class. 
    */ 
} 

function validateClassname(thisInput) { 
    //do something 
} 

正如你所看到的,我試圖找到類的名稱,使之成爲它自己的功能(不使用if語句來驅動它),然後有一個功能做任何事需要做。

我看着這個錯嗎?我應該以不同的方式去改變它嗎? 謝謝

+3

爲什麼不把類名傳遞給一個通用的validateName函數? – 2013-03-18 17:53:48

+0

然後,我將不得不創建if語句,讓它決定什麼是類,然後才能運行它自己的函數 - 我只是試圖切斷中間鬃毛(if語句) – ntgCleaner 2013-03-18 17:57:44

回答

7

我看着這個錯嗎?

是的。下面是使用對象更明智的做法(foobar是類名):

var validationRules = { 
    foo: function(input) { /* whatever */ }, 
    bar: function(input) { /* whatever */ } 
} 

function validate(thisInput){ 
    var thisClass = thisInput.attr("class").split(' ')[0]; 

    validationRules[ thisClass ](thisInput); 
} 

此外,您可能需要使用類名來存儲信息重新考慮。如果有一個以上的課程,並不能保證你想要的那個是第一個。代替data attributes

+0

謝謝!我會試試這個。有了這些輸入,有嚴格的規則概述驗證類將是第一類,它覆蓋了.split() – ntgCleaner 2013-03-18 19:07:03

+0

謝謝,我正在尋找一種方法來裁剪一箇中間人,使代碼看起來更漂亮 – ntgCleaner 2013-03-18 21:40:49

1

您可以使用eval()函數來評估可變命名函數:

var className = "OnName"; 
var classType = "OnType"; 

eval("validate" + className + "()") 
// calls validateOnName() 

eval("validate" + classType + "()") 
// calls validateOnType() 

var someInput = 234; 
eval("validate" + classType + "(" + someInput + ")") 
// calls validateOnType(234) 

不,這是一個理想的解決方案 - 也許你應該考慮使用的功能,比一般的功能或一組爲多個類名擁有多個功能。

+0

我也會看看這個。 – ntgCleaner 2013-03-18 21:38:07