jquery bascule les appels preventDefault () par défaut, afin que les valeurs par défaut ne fonctionnent pas ... vous ne pouvez pas cliquer sur une case à cocher, vous ne pouvez pas cliquer sur un lien, etc.
est-il possible de restaurer le gestionnaire par défaut?
Dans mon cas:
$('#some_link').click(function(event){
event.preventDefault();
});
$('#some_link').unbind('click');
a été la seule méthode pour restaurer l'action par défaut.
C'est assez simple
Supposons que vous fassiez quelque chose comme
document.ontouchmove = function(e){ e.preventDefault(); }
maintenant, pour revenir à la situation initiale, procédez comme suit:.
document.ontouchmove = function(e){ return true; }
De ce site web .
Il n’est pas possible de restaurer une preventDefault()
mais vous pouvez le tromper :)
<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
if($(this).hasClass('prevented')){
e.preventDefault();
$(this).removeClass('prevented');
}else{
$(this).addClass('prevented');
}
});
</script>
Si vous voulez aller plus loin, vous pouvez même utiliser le bouton de déclenchement pour déclencher un événement.
function DoPrevent(e) {
e.preventDefault();
e.stopPropagation();
}
// Bind:
$(element).on('click', DoPrevent);
// UnBind:
$(element).off('click', DoPrevent);
dans certains cas *, vous pouvez initialement return false
au lieu de e.preventDefault()
, puis lorsque vous souhaitez restaurer la valeur par défaut à return true
.
* Signification quand l'événement ne bouillonne pas et que vous n'utilisez pas e.stopPropagation()
avec e.preventDefault()
Voir aussi question similaire (également dans le dépassement de pile)
ou dans le cas d'une case à cocher, vous pouvez avoir quelque chose comme:
$(element).toggle(function(){
$(":checkbox").attr('disabled', true);
},
function(){
$(":checkbox").removeAttr('disabled');
})
s'il s'agit d'un lien, alors $(this).unbind("click");
réactivera le clic de lien et le comportement par défaut sera restauré.
J'ai créé une démo JS fiddle pour montrer comment cela fonctionne:
Voici le code du violon JS:
HTML:
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>
Javascript:
<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
event.preventDefault();
$( "<div>" )
.append( "default " + event.type + " prevented "+counter )
.appendTo( "#log" );
if(counter == 2)
{
$( "<div>" )
.append( "now enable click" )
.appendTo( "#log" );
$(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
}
else
{
$( "<div>" )
.append( "still disabled" )
.appendTo( "#log" );
}
counter++;
});
});
</script>
La meilleure façon de le faire en utilisant un espace de noms. C'est un moyen sûr et sécurisé. Ici, .rb est l’espace de nom qui garantit que la fonction unsind ne fonctionne pas sur cette touche particulière, mais pas sur les autres.
$(document).bind('keydown.rb','Ctrl+r',function(e){
e.stopImmediatePropagation();
return false;
});
$(document).unbind('keydown.rb');
ref1: http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/
Désactiver:
document.ontouchstart = function(e){ e.preventDefault(); }
Activer:
document.ontouchstart = function(e){ return true; }
J'ai eu un problème où je n'avais besoin de l'action par défaut qu'après une action personnalisée (activer les champs de saisie autrement désactivés sur un formulaire). J'ai enveloppé l'action par défaut (submit ()) dans une fonction propre et récursive (dosubmit ()).
var prevdef=true;
var dosubmit=function(){
if(prevdef==true){
//here we can do something else first//
prevdef=false;
dosubmit();
}
else{
$(this).submit();//which was the default action
}
};
$('input#somebutton').click(function(){dosubmit()});
Utilisez un booléen:
let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) {
if (prevent_touch) event.preventDefault();
}
J'utilise cela dans une application Web progressive pour empêcher le défilement/le zoom sur certaines "pages" et les autres.
Vous pouvez définir pour former 2 classes. Une fois que vous avez défini votre script JS sur l’un d’eux, lorsque vous souhaitez le désactiver, supprimez simplement la classe avec le script lié de ce formulaire.
HTML:
<form class="form-create-container form-create"> </form>
JS
$(document).on('submit', '.form-create', function(){
..... ..... .....
$('.form-create-container').removeClass('form-create').submit();
});