Une fois que j'ai tiré un evt.preventDefault()
Comment puis-je reprendre les actions par défaut ?
Réponses
Trop de publicités?Aucune des solutions ne m'a aidé ici et j'ai fait cela pour résoudre ma situation.
<a onclick="return clickEvent(event);" href="http://stackoverflow.com/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();
}
Je suppose que le "contraire" serait de simuler un événement. Vous pourriez 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()
pour que vous puissiez déclencher des événements sur les éléments - parfois utile.
$('#foo').bind('click', function() {
alert($(this).text());
});
$('#foo').trigger('click');
Ce n'est pas une réponse directe à la question mais cela peut aider quelqu'un. Ce que je veux dire, c'est que vous n'appelez preventDefault() qu'en fonction de certaines conditions, car il est inutile d'avoir un événement si vous appelez preventDefault() dans tous les cas. Donc avoir des conditions if et appeler preventDefault() seulement quand la/les condition(s) est/sont satisfaite(s) fera fonctionner la fonction de manière habituelle pour les autres cas.
$('.btnEdit').click(function(e) {
var status = $(this).closest('tr').find('td').eq(3).html().trim();
var tripId = $(this).attr('tripId');
if (status == 'Completed') {
e.preventDefault();
alert("You can't edit completed reservations");
} else if (tripId != '') {
e.preventDefault();
alert("You can't edit a reservation which is already attached to a trip");
}
//else it will continue as usual
});
Jquery on() pourrait être une autre solution à ce problème, surtout lorsqu'il s'agit de l'utilisation du espaces de noms .
jquery on() est simplement la façon actuelle de lier les événements (au lieu de bind()). off() permet de les délier. et lorsque vous utilisez un espace de nom, 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 de l'espace de noms, vous pouvez ajouter plusieurs de ces événements et être en mesure de les supprimer, en fonction de vos besoins bien que submit ne soit pas le meilleur exemple, cela pourrait être utile sur un clic ou une pression de touche ou autre
Dans un flux synchrone, vous appelez e.preventDefault()
seulement quand vous en avez besoin :
a_link.addEventListener('click', (e) => {
if( conditionFailed ) {
e.preventDefault();
// return;
}
// continue with default behaviour i.e redirect to href
});
Dans un flux asynchrone, vous avez plusieurs possibilités, mais l'une d'entre elles, assez courante, consiste à utiliser window.location
:
a_link.addEventListener('click', (e) => {
e.preventDefault(); // prevent default any way
const self = this;
call_returning_promise()
.then(res => {
if(res) {
window.location.replace( self.href );
}
});
});
Vous pouvez certainement rendre le flux ci-dessus synchrone en utilisant async
- await
3 votes
Je pense que, typiquement, votre fonction s'exécuterait et ensuite le comportement par défaut s'exécuterait, donc vous n'appelleriez jamais evt.preventDefault() en premier lieu.
0 votes
Pouvez-vous nous donner un exemple de ce que vous essayez de faire ?
1 votes
Duplicata possible : stackoverflow.com/questions/1551389/
0 votes
Avez-vous regardé cette question et cette réponse ? stackoverflow.com/questions/1164132/
2 votes
@Nobita - Je n'en suis pas si sûr... celui-là est spécifique à jQuery.
1 votes
Wow, merci pour les réponses rapides ! Mon problème est que ce n'est pas moi qui déclenche la fonction evt.preventDefault() ;. Je fais tourner une application flash tierce dans une lightbox. Lorsque je ferme la lightbox, la molette de ma souris pour le défilement de la page s'arrête. En faisant quelques recherches, j'ai découvert que cette application flash désactive le défilement de la page en raison d'une fonction de zoom. J'essaie donc maintenant de reprendre le défilement de la page une fois l'application fermée. Peut-être y a-t-il une méthode que je peux appeler pour reprendre l'événement de la roue de la souris ?
2 votes
Duplicata possible de Comment réactiver event.preventDefault ?
0 votes
En regardant ce lien, comment un CV pourrait-il défiler ?
$(document).unbind('sroll').scroll()
? Je ne suis pas trop sûr de ça.1 votes
Duplicata possible de Comment réactiver la fonction par défaut après avoir utilisé event.preventDefault() ? et Comment réactiver event.preventDefault ?
0 votes
Il s'agit d'une préoccupation valide - comment réactiver la valeur par défaut étant donné que cela a pu remonter dans le domaine à partir d'un autre code ?
0 votes
Essayez la solution mentionnée ici. Entrez la description du lien ici