Javascript:如何将带有字符串参数的函数作为参数传递给另一个函数

时间:2009-05-26 08:39:37

标签: javascript

我需要做这样的事情:

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

这个问题的上下文是在onClick上我需要调用一个javascript函数,该函数将对我提供的url进行ajax调用。它将使用OK和Cancel按钮打开一个模态div。

到此为止,没关系。但是我还需要告诉javascript函数另一个函数与其他参数和在新div中单击OK按钮时要调用的url。另一个用于取消按钮。

问题是我无法正确传递第二个参数,因为它没有正确转义并给我javascript错误。

我已经在SO中搜索了其他类似的Javascript问题,但它们似乎没有涵盖我需要做的事情。

有人知道如何将这种字符串参数传递给javascript函数?或许还有另一个更好的解决办法,即传递我认为没有的东西。

提前致谢

3 个答案:

答案 0 :(得分: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实际上看起来的样子,但你得到了一般的想法。关键是,如果你使用匿名函数,你会有更多的灵活性,并且你的代码也更加清晰。

答案 1 :(得分:7)

试试这个:

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

然后你只需要调用传递给myfunction的这两个函数:

function myfunction(url, f1, f2) {
    // …
    f1();
    f2();
}

答案 2 :(得分: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函数很容易通过,并且可以通过多种方式获取它们的参数。我会避免将它们作为字符串标签传递,但间接是容易出错的。