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


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:



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 .


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.


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

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

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');


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>

2

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

event.stopPropagation();

Odniesienie


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


1

Wyłączyć:

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

Włączyć:

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

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

1

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

$("#element").unbind();

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

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.


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

});

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.