2013-02-22 6 views
8

Voglio evitare che un pulsante di invio con l'evento onclick di presentare:tasto Prevenire presentare con l'evento onclick di presentare

$j('form#userForm .button').click(function(e) { 
    if ($j("#zip_field").val() > 1000){ 
     $j('form#userForm .button').attr('onclick','').unbind('click'); 
     alert('Sorry we leveren alleen inomstreken hijen!'); 
     e.preventDefault(); 
     return false; 
    } 
}); 

Questo è il pulsante di invio:

<button class="button vm-button-correct" type="submit" 
onclick="javascript:return myValidator(userForm, 'savecartuser');">Opslaan</button> 

mostrerà il "avviso "funzione e rimuove anche l'evento onclick, ma il modulo viene inviato comunque. Rimuovere manualmente l'evento onclick prima di inviarlo risolverà il problema. Tuttavia questa è la funzionalità principale di e non voglio rimuoverlo.

EDIT:

E 'sicuramente causato dal selettore onclick .. Come posso forzare il mio script jQuery per ricaricare istantaneamente l'evento onclick? aggiungendo prima di codice jQuery: $j('form#userForm .button').attr('onclick',''); risolverà problema .. comunque la mia convalida non funziona più ... un

+0

Si dovrebbe davvero fare questo nel gestore inviare della forma .. se premere invio quando il modulo ha lo stato attivo, attiverà il gestore di invio e non il tuo clic quindi la convalida verrà ignorata –

risposta

18

Avrai bisogno di aggiungere l'evento come un parametro:

$j('form#userForm .button').click(function(event) { // <- goes here ! 
    if (parseInt($j("#zip_field").val(), 10) > 1000){ 
     event.preventDefault(); 
     $j('form#userForm .button').attr('onclick','').unbind('click'); 
     alert('Sorry we leveren alleen inomstreken hijen!'); 
    } 
}); 

Inoltre, sempre val() restituisce una stringa, quindi una buona pratica sarebbe convertirla in un numero prima di confrontarla con un numero, e non sono sicuro che tu stia veramente bersagliando tutti gli elementiall'interno di #userForm all'interno della funzione, o se dovresti usare this invece?

Se si utilizza jQuery 1.7+, si dovrebbe considerare l'utilizzo di on() e off() per questo.

+0

thx, ho modificato il codice ma non funziona .. Suppongo che l'evento onclick interrompa prevent.default ...? –

+0

L'onclick che è in linea, verrà sempre eseguito per primo, e non è una buona pratica avere una funzione inline come quella, e un gestore di eventi, dovresti probabilmente ripensarlo, e andare solo per il gestore di eventi, e chiamare 'myvalidator() 'dal gestore eventi esterno. – adeneo

+1

molti thx! L'ho scoperto ora;) tuttavia non voglio rompere il codice di base di virtuemart .. Quindi questo è il motivo per cui provo a risolvere in questo modo! –

0

Non dimenticate che ci sono la funzione/argomenti dell'evento, ma è necessario specificare i parametri:

$("#thing").click(function(e) { 
    e.preventDefault(); 
}); 

In questo modo, è stata interrotta la presentazione, e così si può conditionalise esso.

12

In sostanza, se si modifica il tipo di pulsante da type="submit" a type="button", tale pulsante non invia modulo e non sono necessari rimedi.

Spero che questo aiuti.

+0

molti thx ... tuttavia sono abbastanza sicuro che l'evento onclick è la colpa –

+0

Questa risposta ha risolto il mio caso, per me questo dovrebbe essere contrassegnato come risposta giusta, in quanto è più universale :), grazie! –

+0

Sto usando la convalida JQuery. Ho un pulsante con 'type =" button "' ma ancora i postback dei moduli quando la validazione fallisce! [Qui] (http://stackoverflow.com/questions/29890544/page-still-postbacks-after-jquery-validation-fail/29890940#29890940) è la mia domanda. – sohaiby

0

Il modo migliore è fare tutto all'interno del proprio gestore di eventi di invio del modulo. Rimuovere la linea onclick ed eseguirlo all'interno della funzione presentare

$j('#userForm').submit(function(e) { 
    if (+$j("#zip_field").val() > 1000){ 
     alert('Sorry we leveren alleen inomstreken hijen!'); 
     return false; 
    } 
    return myValidator(userForm, 'savecartuser'); 
}); 
-2

Credo che ci sia un modo più semplice:

$j('form#userForm .button').click(function(event) { // <- goes here ! 
    if (parseInt($j("#zip_field").val(), 10) > 1000){ 
     event.stopPropagation(); 
    } 
});