Wie kann ich die Bindung eines Listeners aufheben, der event.preventDefault () aufruft (mithilfe von jQuery)?


128

JQuery Toggle-Aufrufe verhindern standardmäßig DefefDefault (), sodass die Standardeinstellungen nicht funktionieren. Sie können nicht auf ein Kontrollkästchen klicken, Sie können nicht auf einen Link klicken usw. usw.

Ist es möglich, den Standardhandler wiederherzustellen?


Können Sie einen Beispielcode geben?
Jojo

4
Die Frage im Titel ist fantastisch! Schade, dass die eigentliche Frage nicht ... Ich hatte gehofft, hier die Antwort darauf zu finden, wie (wenn überhaupt möglich) wir den Effekt von "deaktivieren" können, preventDefaultnachdem er aufgerufen wurde. Derzeit lautet diese Frage: "Wie kann ich einen Ereignis-Listener mit jQuery aufheben?".
Stijn de Witt

Antworten:


80

In meinem Fall:

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

$('#some_link').unbind('click'); arbeitete als einzige Methode, um die Standardaktion wiederherzustellen.

Wie hier zu sehen: https://stackoverflow.com/a/1673570/211514


2
Wenn dieses Element einen anderen Klick-Handler hat, lösen Sie alle angehängten Ereignisse und verhindern nicht nur den Handler ...
Aure77

56

Es ist ziemlich einfach

Nehmen wir an, Sie machen so etwas

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

Um die ursprüngliche Situation wiederherzustellen, gehen Sie wie folgt vor ...

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

Von dieser Website .


Diese Lösung funktioniert nicht nach $ ('# a_link'). Click (function (e) {e.preventDefault ();}); Unbind-Funktion verwenden.
Denis Makarskiy

2
Der von Ihnen angegebene Link ist fehlerhaft.
Gestapelt

16

Es ist nicht möglich, ein wiederherzustellen, preventDefault()aber Sie können es austricksen :)

<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 noch einen Schritt weiter gehen möchten, können Sie sogar die Auslösetaste verwenden, um ein Ereignis auszulösen.


Ich bin mir ziemlich sicher, dass es so ist - ich habe das kürzlich an einem Design gemacht. Zuerst habe ich auf Knopfdruck das Scrollen in einem iPhone verhindert, indem ich e.preventDefault zu einem Touchmove-Ereignis hinzugefügt habe. Nachdem die Animation fertig war, habe ich true zurückgegeben und es hat wie ein Zauber funktioniert.
Foxybagga

11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

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

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

Die Art und Weise, wie es bei mir funktionierte, war: $ (document) .off ('touchmove'); $ (document) .on ('touchmove', function () {return true;});
Rogervila

9

In einigen Fällen * können Sie zunächst return falsestatt e.preventDefault(), dann, wenn Sie die Standardeinstellung wiederherstellen möchtenreturn true .

* Das heißt, wenn es Ihnen nichts ausmacht, dass das Ereignis sprudelt, und Sie das nicht e.stopPropagation()zusammen mit verwendene.preventDefault()

Siehe auch ähnliche Frage (auch im Stapelüberlauf)

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

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

9

Sie können die Standardaktion wiederherstellen (wenn es sich um eine HREF-Aktion handelt), indem Sie folgende Schritte ausführen:

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


2
Die Ideen stimmten, aber der sofort einsatzbereite Code funktionierte bei mir nicht (es sei denn, es handelt sich nur um eine Syntaxänderung in jquery). Ich habe Folgendes verwendet: window.location = $ (this) .attr ('href');
Modika

3

Wenn es ein Link ist, dann $(this).unbind("click"); , wird das Klicken auf den Link wieder aktiviert und das Standardverhalten wird wiederhergestellt.

Ich habe eine Demo-JS-Geige erstellt , um zu demonstrieren, wie dies 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

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

event.stopPropagation();

Referenz


Sie müssen StopPropagation für einen Handler stoppen, der vor dem Handler auftritt, der die Standardeinstellung verhindert. Sie können dies in der capturePhase tun, wenn Ihr anderer Handler in der Bubble-Phase registriert ist.
Vitim.us

2

Der beste Weg, dies zu tun, indem Sie einen Namespace verwenden. Es ist ein sicherer Weg. Hier ist .rb der Namespace, der sicherstellt, dass die Aufhebungsfunktion für diesen bestimmten Keydown funktioniert, nicht jedoch für andere.

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


1

Deaktivieren:

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

Aktivieren:

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

1

Die PreventDefault () -Methode der Ereignisschnittstelle teilt dem Benutzeragenten mit, dass die Standardaktion nicht wie gewohnt ausgeführt werden sollte, wenn das Ereignis nicht explizit behandelt wird. Das Ereignis wird wie gewohnt fortgesetzt, es sei denn, einer seiner Ereignis-Listener ruft stopPropagation () oder stopImmediatePropagation () auf, wobei beide die Weitergabe sofort beenden.

Durch Aufrufen von präventDefault () in einer beliebigen Phase des Ereignisflusses wird das Ereignis abgebrochen. Dies bedeutet, dass keine Standardaktion ausgeführt wird, die normalerweise von der Implementierung als Ergebnis des Ereignisses ausgeführt wird.

Mit Event.cancelable können Sie überprüfen, ob das Ereignis abgebrochen werden kann. Das Aufrufen von prepareDefault () für ein nicht abbrechbares Ereignis hat keine Auswirkung.

window.onKeydown = event => {
    /*
        if the control button is pressed, the event.ctrKey 
        will be the value  [true]
    */

    if (event.ctrKey && event.keyCode == 83) {
        event.preventDefault();
        // you function in here.
    }
}

0

Ich hatte ein Problem, bei dem ich die Standardaktion erst nach Abschluss einer benutzerdefinierten Aktion (ansonsten deaktivierte Eingabefelder in einem Formular aktivieren) benötigte. Ich habe die Standardaktion (submit ()) in eine eigene rekursive Funktion (dosubmit ()) eingeschlossen.

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

1
Allgemeiner Hinweis: Während einige Codierer der Meinung if (predef == true)sind, dass dies expliziter ist, fügen Sie Ihrem JS-Code ohne Grund 7 Zeichen hinzu. if (prevdef)ist genauso lesbar. Außerdem haben Sie einen redundanten anonymen Ereignishandler hinzugefügt, wenn .click(dosubmit)dasselbe getan wird, .click(function(){dosubmit()})als würden keine Parameter übergeben.
Gone Coding

0

Verwenden Sie einen Booleschen Wert:

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

Ich verwende dies in einer Progressive Web App, um das Scrollen / Zoomen auf einigen "Seiten" zu verhindern, während andere zugelassen werden.


0

Sie können 2 Klassen bilden. Nachdem Sie Ihr JS-Skript auf eines davon festgelegt haben und 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();

});

-3
$('#my_elementtt').click(function(event){
    trigger('click');
});

-10

Ich bin mir nicht sicher, ob Sie das meinen, was Sie meinen. Aber hier ist eine Lösung für ein ähnliches (und möglicherweise dasselbe) Problem ...

Ich benutze häufig präventDefault (), um Elemente abzufangen. Allerdings: Es ist nicht die einzige Methode zum Abfangen. Oft möchten Sie nur eine "Frage", nach der das Verhalten wie zuvor fortgesetzt oder gestoppt wird. In einem kürzlich durchgeführten Fall habe ich die folgende Lösung verwendet:

$("#content").on('click', '#replace', (function(event){ return confirm('Are you sure you want to do that?') }));

Grundsätzlich soll das "Standard verhindern" etwas anderes abfangen und tun: Das "Bestätigen" ist für die Verwendung in ... gut - Bestätigen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.