2009-10-11 11 views
120

jQuery toggle calls preventDefault() domyślnie, więc domyślne ustawienia nie działają. Nie można kliknąć pola wyboru, nie można kliknąć łącza itp. Itd.Jak usunąć powiązanie detektora wywołującego event.preventDefault() (przy użyciu jQuery)?

Czy możliwe jest przywrócenie domyślnego programu obsługi?

+0

Czy możesz podać jakiś przykład kodu? – Jojo

+1

Pytanie w tytule jest fantastyczne! Szkoda, że ​​aktualne pytanie nie jest ... Miałem nadzieję znaleźć tutaj odpowiedź na pytanie, jak (jeśli w ogóle możliwe) możemy "usunąć" efekt "preventDefault" po wywołaniu. Obecnie to pytanie brzmi "jak usunąć powiązanie detektora zdarzeń z jQuery?". –

Odpowiedz

8

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

* Znaczenie jeśli nie przeszkadza pęcherzyków zdarzeń i nie używać e.stopPropagation() wraz z e.preventDefault()

także zobaczyć similar question (także w przepełnienie stosu)

lub w przypadku wyboru ty może mieć coś takiego:

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

nie jest możliwe, aby przywrócić preventDefault() ale co można zrobić, to oszukać go :)

<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 uruchomić zdarzenie.

+0

Jestem prawie pewien, że tak - ostatnio zrobiłem to na designie. Na początku jednym kliknięciem przycisku uniemożliwiłem przewijanie w iPhone'ie dodając e.preventDefault do zdarzenia touchmove, a następnie po zakończeniu animacji powróciłem i działało jak czar. – foxybagga

51

Jego dość prosta

Pozwala przypuszczać można zrobić coś podobnego

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

teraz, aby przywrócić go do pierwotnej sytuacji, wykonaj poniżej ...

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

Od tego website.

+0

To rozwiązanie nie działa po $ ("# a_link"). Click (function (e) { e.preventDefault(); }); użyj funkcji odpinania. –

+1

Podany link jest uszkodzony. – Stacked

-9

Nie jestem pewien co masz na myśli: ale tu jest rozwiązanie dla podobnego (i ewentualnie sam) problem ...

często używam preventDefault(), aby przechwycić przedmiotów. Jednak: nie jest to jedyna metoda przechwytywania ... często możesz po prostu chcieć "pytania", po którym zachowanie zachowuje się tak jak poprzednio lub przestaje. W ostatnim przypadku użyłem następujące rozwiązanie:

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

Zasadniczo, „zapobiec domyślne” ma przechwytywać i zrobić coś innego: „Potwierdź” przeznaczony jest do stosowania w dobrze ... - potwierdzam!

+0

Jestem pewna, że ​​nie otrzymałeś odpowiedzi na pytanie – Stacked

71

W moim przypadku:

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

$('#some_link').unbind('click'); pracował jako jedynej metody przywrócenia domyślnego działania.

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

+1

Jeśli ten element ma inną obsługę kliknięcia, to odłączysz wszystkie zdarzenia związane nie tylko z przeszkodą ... – Aure77

1

Wyłącz:

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

Włącz:

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

można przywrócić domyślną akcję (jeśli jest kontynuacją HREF) w ten sposób:

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

+2

pomysły były poprawne, 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

1

przetestować ten kod, myślę rozwiązać swój problem:

event.stopPropagation(); 

Reference

+1

To nie zadziałało, zamiast tego użyłem polecenia "unbind". – Micer

+0

musisz zatrzymaćPropagację na module obsługi, który występuje przed obsługą, która uniemożliwia domyślne. Możesz to zrobić w fazie przechwytywania, jeśli twój drugi handler jest zarejestrowany w fazie bubble. –

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

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

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

Sposób, w jaki zadziałał, był następujący: $ (dokument) .off ("dotykowy"); $ (dokument) .on ("touchmove", function() {return true;}); – rogervila

0

miałem problem gdzie potrzebne domyślną akcję dopiero po pewnym akcji niestandardowej (enable na inaczej niepełnosprawnych pól wejściowych formularz). Zapakowałem domyślną akcję (submit()) do własnej funkcji rekursywnej (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: Podczas gdy niektórzy koderowie czują, że 'jeśli (predef == true)' jest bardziej jednoznaczny, dodajesz 7 znaków do kodu JS bez żadnego powodu. 'if (prevdef)' jest tak samo czytelne. Dodałeś także nadmiarowy anonimowy moduł obsługi zdarzeń, gdy '.click (dosubmit)' robi to samo, co '.click (funkcja() {dosubmit()}), ponieważ nie przekazano żadnych parametrów. –

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

jeśli jest to związek następnie $(this).unbind("click"); by ponownie włączyć kliknięcie łącza i zachowanie domyślne zostanie przywrócone.

Stworzyłem a demo JS fiddle aby pokazać, 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> 
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", jednocześnie pozwalając innym.

0

Możesz ustawić tak, aby tworzyły 2 klasy. Po ustawieniu skryptu JS na jednym z nich, jeśli chcesz wyłączyć skrypt, po prostu usuń klasę za pomocą skryptu związanego 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(); 

}); 
Powiązane problemy