2009-05-26 6 views
19

que je dois faire quelque chose comme ceci:Javascript: Comment passer une fonction avec des paramètres de chaîne en tant que paramètre à une autre fonction

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

Le contexte de cette question est que le onClick je dois appeler un javascript fonction qui fera un appel ajax à l'URL que je fournis. Il ouvrira un div modal avec les boutons OK et Annuler.

Jusqu'à ici, ça va. Mais alors j'ai aussi besoin de dire à la fonction javascript une autre fonction avec d'autres paramètres et urls à appeler quand un bouton OK est cliqué dans le nouveau div. Et un autre pour le bouton Annuler. Le problème est que je n'arrive pas à passer le deuxième argument correctement car il n'échappe pas correctement et me donne des erreurs javascript.

J'ai fait une recherche pour d'autres questions similaires en Javascript mais pas d'entre eux semblent couvrir ce que j'ai besoin de faire.

Quelqu'un sait comment passer ce type de paramètres de chaîne à la fonction javascript? Ou peut-être y a-t-il une autre meilleure solution pour faire passer ces choses auxquelles je n'ai pas pensé.

Merci à l'avance

Répondre

18

Un moyen serait d'échapper à tout les citations correctement:

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

Dans ce cas, cependant, je pense une meilleure façon de gérer ce serait d'envelopper les deux gestionnaires dans les fonctions anonymes:

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

Et puis, vous pouvez les appeler à l'intérieur myfunction comme ceci:

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

    if (okClicked) 
    { 
     onOK(); 
    } 

    if (cancelClicked) 
    { 
     onCancel(); 
    } 
} 

Ce n'est probablement pas ce à quoi ressemblerait myfunction, mais vous avez l'idée générale. Le fait est que si vous utilisez des fonctions anonymes, vous avez beaucoup plus de flexibilité et vous gardez votre code beaucoup plus propre.

+0

grand! tu as sauvé mon temps. –

4

Moi, je le ferais quelque chose comme ceci:

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); 
} 

Mais je voudrais aussi probablement lier une fermeture à un événement souscrit personnalisé. Vous devez vraiment ajouter quelques détails à la question, mais étant first-class fonctions sont facilement accessibles et obtenir des paramètres pour eux peut être fait de plusieurs façons. Je voudrais éviter de les passer en tant que labels de chaîne si, l'indirection est sujette à erreur.

7

Essayez ceci:

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

Ensuite il vous suffit d'appeler ces deux fonctions passées à myfunction:

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