2010-07-24 12 views
38

可以通過使用字符串來調用函數嗎?來自字符串的jQuery調用函數

(即)我有一個變量var target = 'next';。使用這個字符串,我想調用jquery方法next()。我應該使用target + '()'(這是愚蠢的)撥打next()

我知道這可以使用conditional陳述完成。由於它是從用戶處獲得的字符串,但很難爲所有這些使用條件語句。

在我的jQuery插件中,用戶將傳遞值prev,siblings等作爲選項,以便相應的jQuery方法將被執行。

我該如何實施?

回答

94

您可以使用bracket notation與包含標識符的字符串來訪問該成員:

var target = 'next'; 
$("foobar")[target](); // identical to $("foobar").next() 
+3

哇不知道這一個!這真的減少了我的代碼行! – 2010-07-24 17:31:14

+2

如果您知道可以使用'MyObject.call(myFunctionName,args);'函數式編程FTW調用方法,這非常有用。感謝提示,Gumbo。 – josemota 2011-08-30 14:46:54

+0

你應該已經接受稍微更多的解決方案,因爲這不是保存。特別是因爲你不知道你的用戶輸入什麼。如果他犯了一個錯字,該怎麼辦?略微更多的解決方案不會破壞你的腳本。 – 2012-09-03 16:54:27

13

如果你想使用jQuery,答案是很優雅。因爲jQuery是一個對象(可以像數組一樣訪問) - 您可以使用$("selector")[target]()

例子:

var target = 'next'; 
jQuery("selector")[target](); 

如果你知道你可以信任的輸入這將工作。但是,如果你不確定這一點,你應該在試圖運行它之前檢查函數是否存在,否則你會得到一個錯誤。

var target = 'doesNotExist'; 
if (jQuery.isFunction(target)) { 
    jQuery('selector')[target](); 
} 
8

在我的情況下,我需要從rel屬性獲取值,然後將其解析爲函數,這對我很有用。

$jq('#mainbody form').submit(function(e){ 
    var formcheck = $jq(this).attr('rel'); 
    if (typeof window[formcheck] === 'function'){ 
     formok = window[formcheck](); 
     e.preventDefault(); 
    } 
}); 
function maincheck(){ 
    alert("Checked"); 
    return false; 
} 

和形式

<div id="mainbody"> 
<form action="mainpage.php" method="post" rel="maincheck"> 
<input type="hidden" name="formaction" value="testpost"> 
<label>Field 1 <input type="text" name="field1" value="<?=$_POST['field1'];?>"></label><br> 
<label>Field 2 <input type="text" name="field2" value="<?=$_POST['field2'];?>"></label><br> 
<input type="submit" value="Submit Form"> 
</form> 
</div>