Jak odłączyć detektor, który wywołuje event.preventDefault () (używając jQuery)?

129

jquery toggle wywołuje domyślnie allowDefault (), więc wartości domyślne nie działają. nie możesz kliknąć pola wyboru, nie możesz kliknąć łącza itp

czy można przywrócić domyślną obsługę?

Stijn de Witt
źródło
Czy możesz podać przykładowy kod?
Jojo,
4
Pytanie w tytule jest fantastyczne! Szkoda, że ​​faktyczne pytanie nie brzmi ... Miałem nadzieję, że znajdę tutaj odpowiedź, w jaki sposób (jeśli to w ogóle możliwe) możemy „rozbrajać” efekt preventDefaultpo jego wywołaniu. Obecnie to pytanie brzmi właściwie „jak usunąć powiązanie detektora zdarzeń z jQuery?”.
Stijn de Witt

Odpowiedzi:

81

W moim przypadku:

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

$('#some_link').unbind('click'); działał jako jedyna metoda przywrócenia domyślnej akcji.

Jak widać tutaj: https://stackoverflow.com/a/1673570/211514

klaus
źródło
2
Jeśli ten element ma inny
moduł
56

To dość proste

Załóżmy, że robisz coś takiego

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

teraz, aby przywrócić go do pierwotnej sytuacji, wykonaj poniższe czynności ...

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

Z tej witryny .

foxybagga
źródło
To rozwiązanie nie działa po $ ('# a_link'). Click (function (e) {e.preventDefault ();}); użyj funkcji unbind.
Denis Makarskiy
2
Podany link jest uszkodzony.
Skumulowany
16

Nie można przywrócić pliku, preventDefault()ale możesz go oszukać :)

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

Jeśli chcesz pójść o krok dalej, możesz nawet użyć przycisku wyzwalacza, aby wywołać zdarzenie.

Val
źródło
Jestem całkiem pewien, że tak - ostatnio zrobiłem to na projekcie. Najpierw jednym kliknięciem przycisku uniemożliwiłem przewijanie w iPhonie, dodając e.preventDefault do zdarzenia on touchmove, a następnie po zakończeniu animacji wróciłem prawda i działało jak urok.
foxybagga
11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

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

// UnBind:
$(element).off('click', DoPrevent);
Atara
źródło
Sposób, w jaki to zadziałało, wyglądał następująco: $ (document) .off ('touchmove'); $ (dokument) .on ('touchmove', function () {return true;});
rogervila
9

w niektórych przypadkach * możesz początkowo return falsezamiast e.preventDefault(), a następnie, gdy chcesz przywrócić domyślne pliki return true.

* Oznacza to, że nie masz nic przeciwko bulgotaniu zdarzenia i nie używasz e.stopPropagation()razem ze.preventDefault()

Zobacz także podobne pytanie (także w przepełnieniu stosu)

lub w przypadku checkboxa możesz mieć coś takiego:

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 
adardesign
źródło
9

Możesz przywrócić domyślną akcję (jeśli jest to HREF follow), wykonując następujące czynności:

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

crmpicco
źródło
2
pomysły były słuszne, ale kod po wyjęciu z pudełka nie działał dla mnie (chyba że jest to tylko zmiana składni w jquery). Użyłem: window.location = $ (this) .attr ('href');
Modika
3

jeśli jest to łącze, $(this).unbind("click");spowoduje to ponowne włączenie klikania linku i przywrócenie domyślnego zachowania.

Stworzyłem demo skrzypce JS, aby zademonstrować, jak to działa:

Oto kod skrzypiec 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>
Rahul Gupta
źródło
2

Przetestuj ten kod, myślę, że rozwiąż swój problem:

event.stopPropagation();

Odniesienie

Alireza MH
źródło
musisz zatrzymać Propagację na procedurze obsługi, która występuje przed procedurą obsługi, która zapobiega default. Możesz to zrobić w fazie capturePhase, jeśli Twój drugi program obsługi jest zarejestrowany w fazie bubble.
Vitim.us
2

Najlepszym sposobem na to jest użycie przestrzeni nazw. Jest to bezpieczny sposób. Tutaj .rb jest przestrzenią nazw, która zapewnia, że ​​funkcja unbind działa na tym konkretnym keydown, ale nie na innych.

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

Rajkumar Bansal
źródło
1

Wyłączyć:

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

Włączyć:

document.ontouchstart = function(e){ return true; }
Brynner Ferreira
źródło
1

Metoda allowDefault () interfejsu Event informuje agenta użytkownika, że ​​jeśli zdarzenie nie zostanie jawnie obsłużone, jego domyślna akcja nie powinna być wykonywana w normalny sposób. Zdarzenie jest nadal propagowane w zwykły sposób, chyba że jeden z jego detektorów zdarzeń wywoła stopPropagation () lub stopImmediatePropagation (), z których każdy natychmiast przerwie propagację.

Wywołanie funkcji PreventDefault () na dowolnym etapie przepływu zdarzenia powoduje anulowanie zdarzenia, co oznacza, że ​​żadna domyślna akcja wykonywana normalnie przez implementację w wyniku zdarzenia nie nastąpi.

Możesz użyć Event.cancelable, aby sprawdzić, czy zdarzenie można anulować. Wywołanie funkcji allowDefault () w przypadku zdarzenia, którego nie można anulować, nie ma żadnego efektu.

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.
    }
}
João Victor Palmeira
źródło
1

Jeśli element ma tylko jedną procedurę obsługi, po prostu użyj jQuery unbind.

$("#element").unbind();
Shawn W.
źródło
0

Wystąpił problem polegający na tym, że potrzebowałem domyślnej akcji dopiero po zakończeniu akcji niestandardowej (włącz w inny sposób wyłączone pola wprowadzania danych w formularzu). Umieściłem domyślną akcję (submit ()) we własnej, rekurencyjnej funkcji (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()});
Gyula
źródło
1
Uwaga ogólna: chociaż niektórzy programiści uważają, że if (predef == true)jest to bardziej wyraźne, dodajesz 7 znaków do swojego kodu JS bez powodu. if (prevdef)jest równie czytelny. Ponadto dodano nadmiarową anonimową procedurę obsługi zdarzeń, .click(dosubmit)która robi to samo, .click(function(){dosubmit()})co bez przekazywania parametrów.
Gone Coding
0

Użyj wartości logicznej:

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

Używam tego w progresywnej aplikacji internetowej, aby zapobiec przewijaniu / powiększaniu niektórych „stron”, podczas gdy zezwalam na innych.

TennisVisuals
źródło
0

Możesz ustawić do utworzenia 2 klas. Po ustawieniu skryptu JS na jeden z nich, gdy chcesz wyłączyć swój skrypt, po prostu usuwasz klasę z powiązanym skryptem z tego formularza.

HTML:

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

JS

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

});
Dumitru Boaghi
źródło
-3
$('#my_elementtt').click(function(event){
    trigger('click');
});
T.Todua
źródło
-10

Nie jestem pewien, co masz na myśli: ale oto rozwiązanie podobnego (i prawdopodobnie tego samego) problemu ...

Do przechwytywania elementów często używam funkcji disableDefault (). Jednak: nie jest to jedyna metoda przechwytywania… często możesz chcieć po prostu „zapytać”, które zachowanie trwa jak poprzednio, czy się zatrzymuje. W ostatnim przypadku użyłem następującego rozwiązania:

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

Zasadniczo „zapobieganie domyślnemu” ma na celu przechwycenie i zrobienie czegoś innego: „potwierdzenie” jest przeznaczone do… cóż - potwierdzania!

elb98rm
źródło