Une fois que j'ai tiré une evt.preventDefault()
, comment puis-je reprendre les actions par défaut?
Selon commenté par @Prescott, le contraire de:
evt.preventDefault();
Pourrait être:
Cela équivaut essentiellement à 'do default', puisque nous ne l'en empêchons plus.
Sinon, je suis enclin à vous indiquer les réponses fournies par d'autres commentaires et réponses:
Comment dissocier un écouteur qui appelle event.preventDefault () (à l'aide de jQuery)?
Comment réactiver event.preventDefault?
Notez que le second a été accepté avec un exemple de solution, donné par redsquare (posté ici pour une solution directe au cas où cela ne serait pas fermé en double):
$('form').submit( function(ev) {
ev.preventDefault();
//later you decide you want to submit
$(this).unbind('submit').submit()
});
function(evt) {evt.preventDefault();}
et son contraire
function(evt) {return true;}
à votre santé!
Pour traiter une commande avant de continuer un lien depuis un événement click
dans jQuery:
Exemple: <a href="http://google.com/" class="myevent">Click me</a>
Prévenez et suivez avec jQuery:
$('a.myevent').click(function(event) {
event.preventDefault();
// Do my commands
if( myEventThingFirst() )
{
// then redirect to original location
window.location = this.href;
}
else
{
alert("Couldn't do my thing first");
}
});
Ou exécutez simplement window.location = this.href;
après la preventDefault();
D'ACCORD ! cela fonctionne pour l'événement click:
$("#submit").click(function(e){
e.preventDefault();
-> block the click of the sumbit ... do what you want
$("#submit").unbind('click').click(); // the html click submit work now !
});
Je devais retarder la soumission d'un formulaire dans jQuery afin d'exécuter un appel asynchrone. Voici le code simplifié ...
$("$theform").submit(function(e) {
e.preventDefault();
var $this = $(this);
$.ajax('/path/to/script.php',
{
type: "POST",
data: { value: $("#input_control").val() }
}).done(function(response) {
$this.unbind('submit').submit();
});
});
Je suggérerais le modèle suivant:
document.getElementById("foo").onsubmit = function(e) {
if (document.getElementById("test").value == "test") {
return true;
} else {
e.preventDefault();
}
}
<form id="foo">
<input id="test"/>
<input type="submit"/>
</form>
... sauf si je manque quelque chose.
Il n'y a pas de méthode inverse de event.preventDefault()
pour comprendre pourquoi vous devez d'abord examiner ce que fait event.preventDefault()
lorsque vous l'appelez.
Sous le capot, la fonctionnalité de preventDefault appelle essentiellement un retour false qui interrompt toute exécution ultérieure. Si vous connaissez les anciennes méthodes de Javascript, il était une fois de plus la mode d’utiliser return pour annuler des événements tels que la soumission de formulaires et les boutons avec return true (avant même que jQuery soit disponible).
Comme vous avez probablement déjà pu travailler sur la base de l'explication simple ci-dessus: l'opposé de event.preventDefault()
n'est rien. Vous n'empêchez pas l'événement, par défaut, le navigateur l'autorisera si vous ne l'en empêchez pas.
Voir ci-dessous pour une explication:
;(function($, window, document, undefined)) {
$(function() {
// By default deny the submit
var allowSubmit = false;
$("#someform").on("submit", function(event) {
if (!allowSubmit) {
event.preventDefault();
// Your code logic in here (maybe form validation or something)
// Then you set allowSubmit to true so this code is bypassed
allowSubmit = true;
}
});
});
})(jQuery, window, document);
Dans le code ci-dessus, vous remarquerez que nous vérifions si allowSubmit est faux. Cela signifie que nous empêcherons notre formulaire de soumettre en utilisant event.preventDefault
, puis nous ferons une logique de validation et si nous sommes satisfaits, définissez allowSubmit sur true.
C’est vraiment la seule méthode efficace pour faire l’opposé de event.preventDefault()
- vous pouvez également supprimer les événements qui aboutiraient essentiellement au même résultat.
Je suppose que le "contraire" serait de simuler un événement. Vous pouvez utiliser .createEvent()
En suivant l'exemple de Mozilla:
function simulateClick() {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var cb = document.getElementById("checkbox");
var cancelled = !cb.dispatchEvent(evt);
if(cancelled) {
// A handler called preventDefault
alert("cancelled");
} else {
// None of the handlers called preventDefault
alert("not cancelled");
}
}
Réf: document.createEvent
jQuery a .trigger()
afin que vous puissiez déclencher des événements sur des éléments - parfois utile.
$('#foo').bind('click', function() {
alert($(this).text());
});
$('#foo').trigger('click');
C'est ce que j'avais l'habitude de faire:
$("body").on('touchmove', function(e){
e.preventDefault();
});
Et pour le défaire:
$("body").unbind("touchmove");
event.preventDefault(); //or event.returnValue = false;
et son contraire (standard):
event.returnValue = true;
source: https://developer.mozilla.org/en-US/docs/Web/API/Event/returnValue
jquery on () pourrait être une autre solution à cela. en ce qui concerne l'utilisation de namespaces .
jquery on () est simplement le moyen actuel de lier des événements (au lieu de bind ()). off () est de les dissocier. et lorsque vous utilisez un espace de noms, vous pouvez ajouter et supprimer plusieurs événements différents.
$( selector ).on("submit.my-namespace", function( event ) {
//prevent the event
event.preventDefault();
//cache the selector
var $this = $(this);
if ( my_condition_is_true ) {
//when 'my_condition_is_true' is met, the binding is removed and the event is triggered again.
$this.off("submit.my-namespace").trigger("submit");
}
});
maintenant, avec l’utilisation d’espaces de noms, vous pouvez ajouter plusieurs de ces événements et les supprimer, en fonction de vos besoins. Bien que l’envoi ne soit peut-être pas le meilleur exemple, il pourrait être utile lors d’un clic, d’une pression sur une touche ou autre.
Voici quelque chose d'utile ...
Tout d'abord, nous allons cliquer sur le lien, exécuter du code et exécuter l'action par défaut. Ce sera possible en utilisant event.currentTarget Jetez un coup d'oeil. Ici, nous allons essayer d’accéder à Google sur un nouvel onglet, mais auparavant, nous devons exécuter du code.
<a href="https://www.google.com.br" target="_blank" id="link">Google</a>
<script type="text/javascript">
$(document).ready(function() {
$("#link").click(function(e) {
// Prevent default action
e.preventDefault();
// Here you'll put your code, what you want to execute before default action
alert(123);
// Prevent infinite loop
$(this).unbind('click');
// Execute default action
e.currentTarget.click();
});
});
</script>
vous pouvez l'utiliser après la méthode "preventDefault"
// Evt.target renvoie ici l'événement par défaut
var defaultEvent=evt.target;
// Ici nous sauvegardons l'événement par défaut ..
if("true")
{
//activate default event..
location.href(defaultEvent);
}
Aucune des solutions ne m'a aidé ici et j'ai fait cela pour résoudre ma situation.
<a onclick="return clickEvent(event);" href="/contact-us">
Et la fonction clickEvent()
,
function clickEvent(event) {
event.preventDefault();
// do your thing here
// remove the onclick event trigger and continue with the event
event.target.parentElement.onclick = null;
event.target.parentElement.click();
}
Vous pouvez toujours utiliser cette pièce jointe à un événement de clic dans votre script:
location.href = this.href;
exemple d'utilisation:
jQuery('a').click(function(e) {
location.href = this.href;
});