Co jest przeciwieństwem evt.preventDefault ();


185

Po zwolnieniu i evt.preventDefault()jak mogę wznowić domyślne działania?


3
Myślę, że zazwyczaj twoja funkcja byłaby uruchomiona, a następnie zadziałałoby zachowanie domyślne, więc nigdy nie wywoływałbyś funkcji evt.preventDefault ()
Prescott


2
@Nobita - Nie jestem pewien ... ten jest specyficzny dla jQuery.
gilly3

1
Wow, dzięki za szybkie odpowiedzi! Mój problem polega na tym, że to nie ja odpalam evt.preventDefault () ;. Korzystam z aplikacji Flash innej firmy w lightbox. Kiedy zamykam lightbox, moje kółko myszy do przewijania stron przestaje działać. Podczas niektórych badań odkryłem, że ta aplikacja Flash wyłącza przewijanie strony z powodu funkcji powiększania. Więc teraz próbuję wznowić przewijanie strony po zamknięciu aplikacji. Może jest jakaś metoda, którą mogę wywołać, aby wznowić zdarzenie kółka myszy?
Bryan

Odpowiedzi:


90

Zgodnie z komentarzem @Prescott, przeciwieństwo:

evt.preventDefault();

Możliwe:

Zasadniczo równa się „zrób domyślnie” , ponieważ nie zapobiegamy już temu.

W przeciwnym razie chętnie wskażę odpowiedzi na inne komentarze i odpowiedzi:

Jak odznaczyć detektor wywołujący event.preventDefault () (przy użyciu jQuery)?

Jak ponownie włączyć event.preventDefault?

Zauważ, że drugi został zaakceptowany z przykładowym rozwiązaniem podanym przez redsquare (opublikowanym tutaj dla bezpośredniego rozwiązania na wypadek, gdyby nie zostało zamknięte jako duplikat):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});

Dziękuję Ci! Drapałem się po tym przez chwilę (musiałem się zatrzymać i sprawdzić kilka rzeczy przed przesłaniem formularza, nie poddając się w pewnych okolicznościach, poddając się w innych).
Katharine Osborne

1
Działa, ale nie rozumiem, dlaczego następne przesłanie formularza wywołuje tę funkcję ponownie, myślałem, że to definitywnie rozwiąże, ale wygląda na to, że odłączy tylko bieżące wywołanie ... Nie potrafię tego wyjaśnić, to działa dokładnie to, czego chcę, ale nie tego się spodziewałam.
Vadorequest,

53
function(evt) {evt.preventDefault();}

i przeciwnie

function(evt) {return true;}

Twoje zdrowie!


8
To zadziałało dla mnie, ale zastanawiam się, czy ktoś może wyjaśnić to nieco lepiej, dlaczego?
edhedges

11
Nie cofnie to funkcji zapobieganiaDefault (), w rzeczywistości działa tak samo, jakbyś pominął return true: nic.
br4nnigan

19

Aby przetworzyć polecenie przed kontynuowaniem łącza ze clickzdarzenia w jQuery:

Na przykład: <a href="http://google.com/" class="myevent">Click me</a>

Zapobiegaj i wykonuj za pomocą jQuery:

$('a.myevent').click(function(event) {
    event.preventDefault();

    // Do my commands
    if( myEventThingFirst() )
    {
      // then redirect to original location
      window.location = this.href;
    }
    else
    {
      alert("Couldn't do my thing first");
    }
});

Lub po prostu biegnij window.location = this.href;zapreventDefault();


3
Zgadza się, ale zakłada to, że preventDefault jest linkiem, a nie powiedzieć touchmove na treści dokumentu.
Bangkokian

4
To nie jest pytanie.
Matt Fletcher

8

Musiałem opóźnić przesłanie formularza w jQuery, aby wykonać asynchroniczne wywołanie. Oto uproszczony kod ...

$("$theform").submit(function(e) {
    e.preventDefault();
    var $this = $(this);
    $.ajax('/path/to/script.php',
        {
        type: "POST",
        data: { value: $("#input_control").val() }
    }).done(function(response) {
        $this.unbind('submit').submit();
    });
});

Inną opcją w tym scenariuszu może być użycie typu wejściowego = „przycisk” i powiązanie ze zdarzeniem kliknięcia zamiast użycia typu wejściowego = „przesłanie” i powiązanie ze zdarzeniem przesłania.
Strixy,

8

DOBRZE ! działa w przypadku zdarzenia kliknięcia:

$("#submit").click(function(e){ 

   e.preventDefault();

  -> block the click of the sumbit ... do what you want

$("#submit").unbind('click').click(); // the html click submit work now !

});


4

Sugerowałbym następujący wzór:

document.getElementById("foo").onsubmit = function(e) {
    if (document.getElementById("test").value == "test") {
        return true;
    } else {
        e.preventDefault();
    }
}

<form id="foo">
    <input id="test"/>
    <input type="submit"/>
</form>

... chyba że czegoś mi brakuje.

http://jsfiddle.net/DdvcX/


4

Nie ma przeciwnej metody event.preventDefault()zrozumienia, dlaczego najpierw trzeba spojrzeć na to, co się event.preventDefault()dzieje, kiedy się nazywa.

Pod maską funkcjonalność preventDefault zasadniczo nazywa zwracanie wartości false, co zatrzymuje dalsze wykonywanie. Jeśli znasz stare metody Javascript, kiedyś było modne użycie return false do anulowania zdarzeń na rzeczach takich jak przesyłanie formularzy i przyciski za pomocą return true (zanim jQuery był w pobliżu).

Jak zapewne mogłeś już wypracować na podstawie prostego wyjaśnienia powyżej: przeciwieństwo event.preventDefault()jest niczym. Po prostu nie zapobiegasz zdarzeniu, domyślnie przeglądarka zezwala na zdarzenie, jeśli mu nie zapobiegasz.

Poniżej wyjaśnienie:

;(function($, window, document, undefined)) {

    $(function() {
        // By default deny the submit
        var allowSubmit = false;

        $("#someform").on("submit", function(event) {

            if (!allowSubmit) {
                event.preventDefault();

                // Your code logic in here (maybe form validation or something)
                // Then you set allowSubmit to true so this code is bypassed

                allowSubmit = true;
            }

        });
    });

})(jQuery, window, document);

W powyższym kodzie zauważysz, że sprawdzamy, czy parametr allowSubmit jest fałszywy. Oznacza to, że nie będziemy mogli przesyłać formularza przy użyciu, event.preventDefaulta następnie wykonamy logikę sprawdzania poprawności, a jeśli będziemy zadowoleni, ustaw parametr allowSubmit na true.

Jest to naprawdę jedyna skuteczna metoda działania przeciwnego event.preventDefault()- możesz także spróbować usunąć zdarzenia, które zasadniczo doprowadziłyby do tego samego.


4

Oto coś przydatnego ...

Najpierw klikniemy na link, uruchomimy kod, a następnie wykonamy domyślną akcję. Będzie to możliwe przy użyciu event.currentTarget Spójrz. Tutaj spróbujemy uzyskać dostęp do Google na nowej karcie, ale zanim będziemy musieli uruchomić kod.

<a href="https://www.google.com.br" target="_blank" id="link">Google</a>

<script type="text/javascript">
    $(document).ready(function() {
        $("#link").click(function(e) {

            // Prevent default action
            e.preventDefault();

            // Here you'll put your code, what you want to execute before default action
            alert(123); 

            // Prevent infinite loop
            $(this).unbind('click');

            // Execute default action
            e.currentTarget.click();
        });
    });
</script>

2

Oto, co ustawiłem:

$("body").on('touchmove', function(e){ 
    e.preventDefault(); 
});

I aby to cofnąć:

$("body").unbind("touchmove");

2

Żadne z rozwiązań nie pomogło mi tutaj i zrobiłem to, aby rozwiązać moją sytuację.

<a onclick="return clickEvent(event);" href="/contact-us">

I funkcji clickEvent(),

function clickEvent(event) {
    event.preventDefault();
    // do your thing here

    // remove the onclick event trigger and continue with the event
    event.target.parentElement.onclick = null;
    event.target.parentElement.click();
}

2

Podejrzewam, że „przeciwieństwem” byłoby symulowanie zdarzenia. Możesz użyć.createEvent()

Idąc za przykładem Mozilli:

function simulateClick() {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
  var cb = document.getElementById("checkbox"); 
  var cancelled = !cb.dispatchEvent(evt);
  if(cancelled) {
    // A handler called preventDefault
    alert("cancelled");
  } else {
    // None of the handlers called preventDefault
    alert("not cancelled");
  }
}

Patrz: document.createEvent


jQuery ma, .trigger()więc możesz wyzwalać zdarzenia na elementach - czasem przydatne.

$('#foo').bind('click', function() {
      alert($(this).text());
});

$('#foo').trigger('click');

1

jquery on () może być innym rozwiązaniem tego problemu. ucieleśniająco, jeśli chodzi o wykorzystanie przestrzeni nazw .

jquery on () to tylko bieżący sposób wiązania zdarzeń (zamiast bind ()). off () ma na celu ich usunięcie. a gdy używasz przestrzeni nazw, możesz dodawać i usuwać wiele różnych zdarzeń.

$( selector ).on("submit.my-namespace", function( event ) {
    //prevent the event
    event.preventDefault();

    //cache the selector
    var $this = $(this);

    if ( my_condition_is_true ) {
        //when 'my_condition_is_true' is met, the binding is removed and the event is triggered again.
        $this.off("submit.my-namespace").trigger("submit");
    }
});

teraz za pomocą przestrzeni nazw możesz dodać wiele z tych zdarzeń i możesz je usunąć, w zależności od potrzeb. Podczas gdy przesyłanie może nie być najlepszym przykładem, może się przydać po kliknięciu, naciśnięciu klawisza lub cokolwiek innego.


1

To nie jest bezpośrednia odpowiedź na pytanie, ale może komuś pomóc. Chodzi mi o to, że wywołujesz preventDefault () tylko w oparciu o niektóre warunki, ponieważ nie ma sensu mieć zdarzenia, jeśli wywołasz funkcję preventDefault () we wszystkich przypadkach. Zatem posiadanie if i wywoływanie preventDefault () tylko wtedy, gdy spełniony jest warunek / warunki, będzie działał w zwykły sposób dla pozostałych przypadków.

$('.btnEdit').click(function(e) {

   var status = $(this).closest('tr').find('td').eq(3).html().trim();
   var tripId = $(this).attr('tripId');

  if (status == 'Completed') {

     e.preventDefault();
     alert("You can't edit completed reservations");

 } else if (tripId != '') {

    e.preventDefault();
    alert("You can't edit a reservation which is already attached to a trip");
 }
 //else it will continue as usual

});


0

możesz użyć tego po metodzie „preventDefault”

// Tutaj evt.target zwraca domyślne zdarzenie (np .: defult url etc)

var defaultEvent=evt.target;

// Tutaj zapisujemy domyślne zdarzenie.

if("true")
{
//activate default event..
location.href(defaultEvent);
}

0

Zawsze możesz użyć tego skryptu dołączonego do jakiegoś zdarzenia kliknięcia:

location.href = this.href;

przykładem użycia jest:

jQuery('a').click(function(e) {
    location.href = this.href;
});

-1

ten kod działał dla mnie w celu ponownego utworzenia zdarzenia po użyciu:

event.preventDefault(); to disable the event.


event.preventDefault = false;

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.