2009-07-22 9 views
56

J'ai une page Web dont j'ai empêché l'action par défaut sur tous les boutons de soumission, mais je voudrais réactiver l'action de soumission par défaut sur un bouton comment puis-je faire cela?Comment réactiver event.preventDefault?

Je suis empêchent actuellement l'action par défaut en utilisant les éléments suivants:

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

Je l'ai fait avec succès ce en utilisant les éléments suivants:

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

Mais puis-je faire de manière dynamique lorsque le bouton est cliqué?

+0

Possibilité de duplication de [comment activer par défaut après event.preventDefault()?] (Http://stackoverflow.com/questions/1551389/how-to-enable-default-after-event-preventdefault) –

Répondre

104

Vous devez dissocier l'événement et renvoyer à un événement distinct qui n'empêche pasDefault ou appelez simplement l'événement par défaut plus tard dans la méthode après la liaison. Il n'y a pas de magie event.cancelled = false;

Comme demandé

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

     ev.preventDefault(); 

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

    }); 
+0

Merci pour votre répondez, pourriez-vous me donner un exemple de la façon de le faire. – Richbits

+0

Merci, pensé que j'avais essayé, mais évidemment pas. – Richbits

+3

L'une des meilleures choses à faire est d'appeler preventDefault() quand vous en avez besoin, en fonction des conditions. Bien que ce soit le seul moyen de réaliser exactement ce que vous avez décrit, je vous encourage à vérifier que c'est la meilleure solution à votre problème. :) – Swivel

12

Soit vous faites ce que redsquare propose avec ce code:

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

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

Ou vous attribuez un attribut de forme à chaque fois que la soumission est autorisée. Quelque chose comme ceci:

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

Une solution simple et intéressante! Cela a résolu mon problème d'activer/désactiver le comportement par défaut d'iOS pour le défilement du corps élastique et de garder certains éléments défilables. Cool! – 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' et '$ (this) .trigger ('submit')' se déroulera ici même 'e.preventDefault()'. c'est une mauvaise réponse. –

+0

@ i-- Merci! Je l'ai corrigé, c'était une faute de frappe – adardesign

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

et son contraire

function(e){ return true; } 

acclamations!

+0

Un problème, qui est que si tout ce que vous voulez faire prend trop de temps (par exemple, faire un appel Ajax) vous ne pouvez jamais atteindre "return false" ou "e.preventDefault()" si vous le mettre après le conditionnel. – Casey

-3

Vous pouvez réactiver les actions en ajoutant

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

Si vous ajoutez à la fonction de la vue d'une colonne vertébrale rendre, vous pouvez utiliser event.preventDefault() selon les besoins.

0

avec des actions (async minuteries, ajax), vous pouvez remplacer la propriété isDefaultPrevented comme ceci:

$('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); 
} 

C'est la façon la plus complète de redéclencher l'événement avec les exactement les mêmes données.

Questions connexes