2009-05-26 48 views
19

ho bisogno di fare qualcosa di simile:Javascript: Come passare una funzione con parametri di stringa come parametro a un'altra funzione

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

Il contesto di questa domanda è che l'onClick ho bisogno di chiamare un javascript funzione che effettuerà una chiamata Ajax all'URL che fornisco. Si aprirà un div modale con i pulsanti OK e Annulla.

Fino a qui va bene. Ma poi ho anche dovuto dire alla funzione javascript un'altra funzione con altri parametri e url da chiamare quando si fa clic su un pulsante OK nel nuovo div. E un altro per il pulsante Annulla.

Il problema è che non riesco a passare correttamente il secondo argomento in quanto non scappa correttamente e mi dà errori javascript.

Ho fatto una ricerca per altre domande Javascript simili in SO ma non sembrano coprire quello che devo fare.

Qualcuno sa come posso passare questo tipo di parametri di stringa alla funzione javascript? O forse c'è un'altra soluzione migliore per far passare queste cose a cui non ho pensato.

Grazie in anticipo

risposta

18

Un modo potrebbe essere quello di sfuggire solo le virgolette correttamente:

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

In questo caso, però, credo che un modo migliore per gestire questa situazione sarebbe quello di avvolgere i due gestori nelle funzioni anonime:

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

E poi, li si potrebbe chiamare dall'interno myfunction come questo:

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

    if (okClicked) 
    { 
     onOK(); 
    } 

    if (cancelClicked) 
    { 
     onCancel(); 
    } 
} 

Probabilmente non è quello che dovrebbe essere lo myfunction, ma si ottiene l'idea generale. Il punto è che, se usi funzioni anonime, hai molta più flessibilità e mantieni il tuo codice molto più pulito.

+0

grande! mi hai salvato il tempo. –

4

me, lo farei qualcosa di simile:

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

Ma poi mi piacerebbe anche probabile essere vincolante una chiusura a un evento personalizzato sottoscritto. È necessario aggiungere alcuni dettagli alla domanda, ma le funzioni first-class sono facilmente passabili e ottenere i parametri può essere fatto in diversi modi. Eviterei di passarli come etichette stringa, tuttavia, l'indirezione è soggetta ad errori.

7

Prova questo:

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

Poi basta chiamare queste due funzioni passati a myfunction:

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