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ę?
javascript
jquery
events
preventdefault
event-bubbling
Stijn de Witt
źródło
źródło
preventDefault
po jego wywołaniu. Obecnie to pytanie brzmi właściwie „jak usunąć powiązanie detektora zdarzeń z jQuery?”.Odpowiedzi:
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
źródło
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 .
źródło
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.
źródło
function DoPrevent(e) { e.preventDefault(); e.stopPropagation(); } // Bind: $(element).on('click', DoPrevent); // UnBind: $(element).off('click', DoPrevent);
źródło
w niektórych przypadkach * możesz początkowo
return false
zamiaste.preventDefault()
, a następnie, gdy chcesz przywrócić domyślne plikireturn 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'); })
źródło
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');
źródło
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>
źródło
Przetestuj ten kod, myślę, że rozwiąż swój problem:
Odniesienie
źródło
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
źródło
Wyłączyć:
document.ontouchstart = function(e){ e.preventDefault(); }
Włączyć:
document.ontouchstart = function(e){ return true; }
źródło
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. } }
źródło
Jeśli element ma tylko jedną procedurę obsługi, po prostu użyj jQuery unbind.
$("#element").unbind();
źródło
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()});
źródło
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.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.
źródło
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(); });
źródło
$('#my_elementtt').click(function(event){ trigger('click'); });
źródło
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!
źródło