Подтвердить что ты не робот

Javascript: как передать функцию со строковыми параметрами в качестве параметра в другую функцию

Мне нужно сделать что-то вроде этого:

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

Контекст этого вопроса заключается в том, что в onClick мне нужно вызвать функцию javascript, которая сделает вызов ajax на url, который я предоставляю. Он откроет модальный div с кнопками "ОК" и "Отмена".

До сих пор это прекрасно. Но тогда мне также нужно было сказать функции javascript другую функцию с другими параметрами и URL-адресами, которые будут вызываться, когда в новом div будет нажата кнопка OK. И еще один для кнопки Отмена.

Проблема в том, что я не могу правильно передать второй аргумент, так как он не убежит должным образом и дает мне ошибки JavaScript.

Я выполнил поиск других подобных Javascript-вопросов в SO, но не они, похоже, покрывают то, что мне нужно делать.

Кто-нибудь знает, как передать этот тип строковых параметров функции javascript? Или, может быть, есть еще одно лучшее решение передать эти вещи, о которых я не думал.

Заранее спасибо

4b9b3361

Ответ 1

Одним из способов было бы просто избежать кавычек правильно:

<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, но вы получите общую идею. Дело в том, что если вы используете анонимные функции, у вас будет намного больше гибкости, и вы также сохраните свой код намного чище.

Ответ 2

Попробуйте следующее:

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

Затем вам просто нужно вызвать эти две функции, переданные в myfunction:

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

Ответ 3

Я, я бы сделал это примерно так:

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 функции легко проходимы, и получение параметров к ним может быть выполнено любым числом способов. Я бы избегал передавать их как строковые метки, хотя косвенность подвержена ошибкам.