2009-07-22 11 views
56

Ho una pagina Web in cui ho impedito l'azione predefinita su tutti i pulsanti di invio, tuttavia vorrei riattivare l'azione di invio predefinita su un pulsante come posso fare?Come riattivare event.preventDefault?

Attualmente sto impedendo l'azione di default utilizzando il seguente:

$("form").bind("submit", function(e){ 
e.preventDefault(); 
}); 

ho fatto con successo questa operazione utilizzando il seguente:

$(document).ready(function(){ 
$("form:not('#press')").bind("submit", function(e){ 
e.preventDefault(); 
}); 

Ma posso fare questo in modo dinamico quando viene cliccato il pulsante?

+0

Possibile duplicato di [come abilitare il valore predefinito dopo event.preventDefault()?] (Http://stackoverflow.com/questions/1551389/how-to-enable-default-after-event-preventdefault) –

risposta

104

È necessario separare l'evento e ricollegarsi a un evento separato che non previene Default o semplicemente chiamare l'evento predefinito in un secondo momento nel metodo dopo lo sbiadimento. Non c'è evento magico.cancelled = false;

come richiesto

$('form').submit(function(ev){ 

     ev.preventDefault(); 

     //later you decide you want to submit 
     $(this).unbind('submit').submit() 

    }); 
+0

Grazie per il tuo rispondi, potresti darmi un esempio di come farlo. – Richbits

+0

Grazie, ho pensato che ci avevo provato, ma ovviamente no. – Richbits

+3

Una delle cose migliori da fare è chiamare preventDefault() quando è necessario, in base ai condizionali. Mentre questo è l'unico vero modo per ottenere esattamente ciò che hai descritto, ti invito a verificare che questa sia la migliore soluzione al tuo problema. :) – Swivel

12

O si fa quello che redsquare propone con questo codice:

function preventDefault(e) { 
    e.preventDefault(); 
} 
$("form").bind("submit", preventDefault); 

// later, now switching back 
$("form#foo").unbind("submit", preventDefault); 

O si assegna un attributo form ogni volta che viene consentita la presentazione. Qualcosa di simile a questo:

function preventDefault(e) { 
    if (event.currentTarget.allowDefault) { 
     return; 
    } 
    e.preventDefault(); 
} 
$("form").bind("submit", preventDefault); 

// later, now allowing submissions on the form 
$("form#foo").get(0).allowDefault = true; 
+0

Una soluzione semplicissima! Questo ha risolto il mio problema di attivare/disattivare il comportamento predefinito di iOS per lo scorrimento del corpo elastico e mantenere alcuni elementi scorrevoli. Freddo! – Garavani

1
$('form').submit(function(e){ 

    e.preventDefault(); 

    //later you decide you want to submit 
    $(this).trigger('submit');  or  $(this).trigger('anyEvent'); 
+3

typo 'ev' vs' e' e '$ (this) .trigger ('submit')' qui verrà eseguito nello stesso 'e.preventDefault()'. questa è una cattiva risposta. –

+0

@ i-- Grazie! L'ho risolto, era un errore di battitura – adardesign

1
function(e){ e.preventDefault(); 

e il contrario di

function(e){ return true; } 

applausi!

+0

Un problema, che è che se tutto ciò che vuoi fare richiede troppo tempo (ad esempio, effettuare una chiamata Ajax) potresti non raggiungere mai "return false" o "e.preventDefault()" se mettilo dopo il condizionale. – Casey

-3

è possibile ri-attivare le azioni con l'aggiunta di

this.delegateEvents(); // Re-activates the events for all the buttons 

Se si aggiunge alla funzione rendering di vista una spina dorsale js, quindi è possibile utilizzare event.preventDefault() come richiesto.

0

con le azioni asincrone (timer, Ajax) è possibile ignorare la proprietà isDefaultPrevented in questo modo:

$('a').click(function(evt){ 
    e.preventDefault(); 

    // in async handler (ajax/timer) do these actions: 
    setTimeout(function(){ 
    // override prevented flag to prevent jquery from discarding event 
    evt.isDefaultPrevented = function(){ return false; } 
    // retrigger with the exactly same event data 
    $(this).trigger(evt); 
    }, 1000); 
} 

Questo è il modo più completo del riarmo della manifestazione con esattamente gli stessi dati.

Problemi correlati