2009-05-26 120 views
19

我需要做這樣的事情:的Javascript:如何通過使用字符串參數的函數作爲參數傳遞給另一個函數

<input type="button" value="click" id="mybtn" 
onclick="myfunction('/myController/myAction', 
        'myfuncionOnOK('/myController2/myAction2', 
            'myParameter2');', 
        'myfuncionOnCancel('/myController3/myAction3', 
            'myParameter3');');" /> 

這個問題的背景是上的onClick我需要調用一個javascript函數將會對我提供的url進行ajax調用。它會打開一個模式分區與確定和取消按鈕。

到這裏沒事的。但是,我還需要告訴javascript函數另一個函數,其他參數和url將在新的div中單擊確定按鈕時調用。另一個是取消按鈕。

問題是我無法設法正確地傳遞第二個參數,因爲它不能正確地轉義並給我javascript錯誤。

我已經在SO中搜索了其他類似的Javascript問題,但其中沒有一個似乎涵蓋了我需要做的事情。

任何人都知道我怎麼可以將這種字符串參數傳遞給javascript函數?或者,也許有另一個更好的解決方案來傳遞這些我沒有想到的東西。

在此先感謝

回答

18

一種方法是隻逃脫引號正確:

<input type="button" value="click" id="mybtn" 
     onclick="myfunction('/myController/myAction', 
       'myfuncionOnOK(\'/myController2/myAction2\', 
        \'myParameter2\');', 
       'myfuncionOnCancel(\'/myController3/myAction3\', 
        \'myParameter3\');');"> 

在這種情況下,雖然,我認爲更好的方式來處理,這將是包裝兩個處理程序在匿名函數:

<input type="button" value="click" id="mybtn" 
     onclick="myfunction('/myController/myAction', 
       function() { myfuncionOnOK('/myController2/myAction2', 
          'myParameter2'); }, 
       function() { myfuncionOnCancel('/myController3/myAction3', 
          'myParameter3'); });"> 

然後,你可以從myfunction內調用它們像這樣:

function myfunction(url, onOK, onCancel) 
{ 
    // Do whatever myfunction would normally do... 

    if (okClicked) 
    { 
     onOK(); 
    } 

    if (cancelClicked) 
    { 
     onCancel(); 
    } 
} 

這可能不是myfunction實際上的樣子,但是你會得到一般想法。關鍵是,如果您使用匿名函數,您將擁有更多的靈活性,並且您的代碼也會更加清晰。

+0

太棒了!你節省了我的時間。 – 2014-07-30 08:45:42

4

我,我會做這樣的事情:

HTML:

onclick="myfunction({path:'/myController/myAction', ok:myfunctionOnOk, okArgs:['/myController2/myAction2','myParameter2'], cancel:myfunctionOnCancel, cancelArgs:['/myController3/myAction3','myParameter3']);" 

JS:

function myfunction(params) 
{ 
    var path = params.path; 

    /* do stuff */ 

    // on ok condition 
    params.ok(params.okArgs); 

    // on cancel condition 
    params.cancel(params.cancelArgs); 
} 

但是,我也願意可能會將封閉綁定到自定義訂閱事件。你需要爲這個問題添加一些細節,但是作爲first-class函數很容易通過,並且可以通過多種方式獲得參數。我會避免將它們作爲字符串標籤傳遞,但間接性很容易出錯。

7

試試這個:

onclick="myfunction(
    '/myController/myAction', 
    function(){myfuncionOnOK('/myController2/myAction2','myParameter2');}, 
    function(){myfuncionOnCancel('/myController3/myAction3','myParameter3');} 
);" 

然後你只需要通過這兩個函數調用myfunction

function myfunction(url, f1, f2) { 
    // … 
    f1(); 
    f2(); 
} 
相關問題