2012-01-30 4 views
11

Attualmente sto utilizzando jquery per intercettare l'invio di un modulo e mostrare agli utenti una finestra di dialogo per la conferma. Se l'utente fa clic sì, allora il modulo deve inviare. Se l'utente fa clic su no, quindi chiude la finestra di dialogo.Jquery trap form submit()

Tutto questo funziona bene ma per un problema: quando l'utente fa clic su Sì, attiva nuovamente lo stesso codice e la finestra di dialogo viene riaperta.

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        $("#myform").submit(); 
        return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 

Capisco perché questo sta accadendo, solo non sono sicuro sul modo migliore per aggirare. Mi rendo conto che potrei mostrare la modale al clic del pulsante, invece del modulo submit, ma questo non risolve il problema di premere il pulsante Invio sulla tastiera per inviare il modulo.

+0

Molto interessante! Non penso che ci sia un modo ovvio per aggirarlo, anche se spero che qualcuno possa dimostrarmi che ho torto! Hai provato a integrare la funzionalità 'preventDefault()'? –

risposta

12

Perché quando si submit il modulo, l'evento submit innesca di nuovo e così il gestore di eventi. È necessario unbind il gestore di eventi submit quando l'utente dice OK. Prova questa

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        //Check this line - unbinding the submit event handler 
        $("#myform").unbind('submit').submit(); 
        return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 
+0

Fantastico, grazie per la soluzione. Ho imparato qualcosa di nuovo oggi: il metodo unbind()! – JonoB

+0

FYI quando l'utente fa clic su "OK", si tratta di un evento diverso da quello di invio del modulo, quindi restituire false non ha importanza nel gestore per il pulsante "OK". –

+0

@MelStanley - Yup l'ha capito dopo, ma grazie. Rimosso quella parte dalla risposta. – ShankarSangoli

5

Si dovrebbe restituire false quando OK:

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        $("#myform").submit(); 
        return false; // <=== not just return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 

Oppure cancellare il manuale di presentare:

buttons: { 
"OK": function() { 
    $dialog.dialog('close'); 
    //$("#myform").submit(); <-- delete it 
    return; 
}, 
0

vorrei fare something o un namespace, o un valore globale di qualche input nascosto in questo modo:

var something = nameSpaced.something || $('#hiddenInput').val(); //your choice 
if (something) { 
    ... 
} ... 

La logica dovrebbe funzionare normalmente, allora.

0

Inche, prima di utilizzare l'oggetto jQuery per inviare il modulo, è possibile utilizzare l'elemento DOM a cui fa riferimento l'oggetto jQuery per inviare il modulo. Questo aggira il gestore di eventi jQuery. La tua funzione OK sarebbe simile a questa:

"OK": function() { 
    $dialog.dialog('close'); 
    $("#myform").get(0).submit(); // use the underlying DOM element to sumbit 
    return false; 
},