it-swarm.com.de

Wie lösen Sie die Bindung eines Listeners, der event.preventDefault () (mit jQuery) aufruft?

jquery toggle ruft das Kommando defaultDefault () standardmäßig auf, so dass die Standardeinstellungen nicht funktionieren. Sie können nicht auf ein Kontrollkästchen klicken, Sie können nicht auf einen Link klicken usw.

kann der Standard-Handler wiederhergestellt werden?

126
user188049

In meinem Fall:

$('#some_link').click(function(event){
    event.preventDefault();
});

$('#some_link').unbind('click'); hat als einzige Methode die Standardaktion wiederhergestellt.

Wie hier gesehen: https://stackoverflow.com/a/1673570/211514

76
klaus

Es ist ziemlich einfach

Nehmen wir an, Sie tun so etwas

document.ontouchmove = function(e){ e.preventDefault(); }

um es wieder in die ursprüngliche Situation zu bringen, tun Sie das unten ...

document.ontouchmove = function(e){ return true; }

Von dieser Website .

53
foxybagga

Es ist nicht möglich, eine preventDefault() wiederherzustellen, aber Sie können dies tun:

<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>

Wenn Sie einen Schritt weiter gehen möchten, können Sie sogar den Auslöser verwenden, um ein Ereignis auszulösen.

16
Val
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

// Bind:
$(element).on('click', DoPrevent);

// UnBind:
$(element).off('click', DoPrevent);
10
Atara

Sie können die Standardaktion wiederherstellen (wenn es sich um eine HREF handelt), indem Sie dies tun:

window.location = $(this).attr('href');

9
crmpicco

in einigen Fällen können Sie return false anstelle von e.preventDefault() verwenden. Wenn Sie dann den Standardwert auf return true wiederherstellen möchten.

* Bedeutet, dass es Ihnen nichts ausmacht, wenn das Ereignis brodelt und Sie die e.stopPropagation() nicht zusammen mit e.preventDefault() verwenden. 

Siehe auch ähnliche Frage (auch im Stack Overflow)

oder im Falle eines Kontrollkästchens können Sie Folgendes haben: 

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 
9
adardesign

wenn es sich um einen Link handelt, aktiviert $(this).unbind("click"); das Klicken auf den Link erneut und das Standardverhalten wird wiederhergestellt.

Ich habe eine Demo-JS-Geige erstellt, um zu zeigen, wie das funktioniert:

Hier ist der Code der JS-Geige:

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>
2
Rahul Gupta

Der beste Weg dazu ist der Namespace. Es ist ein sicherer Weg. Hier ist .rb der Namespace, der sicherstellt, dass die Funktion der unbindenden Funktion für den jeweiligen Keydown funktioniert, für andere jedoch nicht.

$(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/

ref2: http://jqfundamentals.com/chapter/events

2
Rajkumar Bansal

Deaktivieren:

document.ontouchstart = function(e){ e.preventDefault(); }

Aktivieren:

document.ontouchstart = function(e){ return true; }
1

Testen Sie diesen Code, ich denke, lösen Sie Ihr Problem:

event.stopPropagation();

Referenz

1
Alireza MH

Ich hatte ein Problem, bei dem ich die Standardaktion nur brauchte, nachdem eine benutzerdefinierte Aktion (sonst deaktivierte Eingabefelder in einem Formular aktivieren) abgeschlossen war. Ich habe die Standardaktion (submit ()) in eine eigene rekursive Funktion (dosubmit ()) verpackt.

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()});
0
Gyula

Verwenden Sie ein Boolean:

let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
}

Ich verwende dies in einer progressiven Webanwendung, um das Scrollen/Zoomen auf einigen "Seiten" zu verhindern und andere zuzulassen.

0
TennisVisuals

Sie können 2 Klassen bilden. Nachdem Sie Ihr JS-Skript auf eines von ihnen festgelegt haben, wenn Sie Ihr Skript deaktivieren möchten, löschen Sie einfach die Klasse mit gebundenem Skript aus diesem Formular.

HTML: 

<form class="form-create-container form-create"> </form>   

JS 

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit();

});
0
Dumitru Boaghi