Qual è l'opposto di evt.preventDefault ();


185

Una volta che ho sparato evt.preventDefault(), come posso riprendere di nuovo le azioni predefinite?


3
Penso che in genere la tua funzione venga eseguita e quindi il comportamento predefinito verrà eseguito, quindi non chiameresti mai evt.preventDefault () in primo luogo
Prescott


2
@Nobita - Non sono così sicuro ... che uno sia specifico di jQuery.
gilly3,

1
Wow, grazie per le risposte rapide! Il mio problema è che non sono io a sparare a evt.preventDefault () ;. Sto eseguendo un'applicazione flash di terze parti in una lightbox. Quando chiudo la lightbox, in qualche modo la rotellina del mouse per lo scorrimento della pagina si interrompe. Nel fare alcune ricerche, ho scoperto che questa app flash disabilita lo scorrimento delle pagine a causa di una funzione di zoom. Quindi ora sto cercando di riprendere lo scorrimento della pagina una volta chiusa l'app. Forse esiste un metodo che posso chiamare per riprendere l'evento della rotellina del mouse?
Bryan,

Risposte:


90

Come commentato da @Prescott, l'opposto di:

evt.preventDefault();

Potrebbe essere:

Essenzialmente equivalente a "fare default" , poiché non lo stiamo più impedendo.

Altrimenti sono propenso a indicarti le risposte fornite da altri commenti e risposte:

Come separare un ascoltatore che chiama event.preventDefault () (usando jQuery)?

Come riattivare event.preventDefault?

Si noti che la seconda è stata accettata con una soluzione di esempio, fornita da redsquare (pubblicata qui per una soluzione diretta nel caso in cui questa non sia chiusa come duplicata):

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

Grazie! Stavo grattandomi per un po 'di tempo su questo (avevo bisogno di fermarmi e controllare alcune cose prima che un modulo fosse inviato, non in alcune circostanze, in altre).
Katharine Osborne,

1
Funziona ma non capisco perché il prossimo modulo submit richiama di nuovo la funzione, ho pensato che non si sarebbe risolto definitivamente, ma sembra che si sciolga solo per la chiamata corrente ... Non riesco a spiegarlo, lo fa esattamente quello che voglio ma non è quello che mi sarei aspettato.
Vadorequest,

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

e il suo contrario

function(evt) {return true;}

Saluti!


8
Questo ha funzionato per me, ma mi chiedo se qualcuno può spiegarlo un po 'meglio sul perché?
bordure

11
Questo non annulla preventDefault (), in realtà fa lo stesso come se si preferisse ommettere il return true: niente.
br4nnigan,

19

Per elaborare un comando prima di continuare un collegamento da un clickevento in jQuery:

Per esempio: <a href="http://google.com/" class="myevent">Click me</a>

Prevenire e seguire con 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");
    }
});

O semplicemente insegui window.location = this.href;ilpreventDefault();


3
Giusto, ma ciò presuppone che preventDefault sia un collegamento e non si tratti di touchmove sul corpo del documento.
Bangkok,

4
Non è questa la domanda.
Matt Fletcher,

8

Ho dovuto ritardare l'invio di un modulo in jQuery per eseguire una chiamata asincrona. Ecco il codice semplificato ...

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

Un'altra opzione in questo scenario potrebbe essere l'uso di input type = "button" e l'associazione all'evento click invece di utilizzare input type = "submit" e l'associazione all'evento submit.
Strixy,

8

OK ! funziona per l'evento click:

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

Vorrei suggerire il seguente modello:

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>

... a meno che non mi manchi qualcosa.

http://jsfiddle.net/DdvcX/


4

Non esiste un metodo opposto event.preventDefault()per capire perché devi prima esaminare cosa event.preventDefault()fa quando lo chiami.

Sotto il cofano, la funzionalità di preventDefault sta essenzialmente chiamando un ritorno falso che blocca qualsiasi ulteriore esecuzione. Se hai familiarità con i vecchi modi di Javascript, una volta era di moda usare return false per cancellare eventi su cose come invii di moduli e pulsanti usando return true (prima ancora che jQuery fosse in giro).

Come probabilmente avrai già capito basandoti sulla semplice spiegazione sopra: l'opposto di event.preventDefault()è nulla. Semplicemente non si impedisce l'evento, per impostazione predefinita il browser consentirà l'evento se non lo si sta impedendo.

Vedi sotto per una spiegazione:

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

Nel codice sopra noterai che stiamo controllando se allowSubmit è falso. Ciò significa che impediremo l'invio del nostro modulo mediante event.preventDefaulte quindi eseguiremo alcune logiche di convalida e, se siamo soddisfatti, impostare allowSubmit su true.

Questo è davvero l'unico metodo efficace per fare l'opposto di event.preventDefault()- puoi anche provare a rimuovere anche gli eventi che sostanzialmente raggiungerebbero la stessa cosa.


4

Ecco qualcosa di utile ...

Prima di tutto faremo clic sul collegamento, eseguiremo un po 'di codice e poi eseguiremo l'azione predefinita. Questo sarà possibile utilizzando event.currentTarget Dai un'occhiata. Qui proveremo ad accedere a Google in una nuova scheda, ma prima dobbiamo eseguire un po 'di codice.

<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

Questo è ciò che ho usato per impostarlo:

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

E per annullarlo:

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

2

Nessuna delle soluzioni mi ha aiutato qui e l'ho fatto per risolvere la mia situazione.

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

E la funzione 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

Suppongo che "l'opposto" sarebbe simulare un evento. Puoi usare.createEvent()

Seguendo l'esempio di Mozilla:

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

Rif: document.createEvent


jQuery ha .trigger()così puoi innescare eventi su elementi - a volte utili.

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

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

1

jquery on () potrebbe essere un'altra soluzione a questo. soprattutto quando si tratta dell'uso di spazi dei nomi .

jquery on () è solo il modo attuale di associare eventi (invece di bind ()). off () è di scioglierli. e quando si utilizza uno spazio dei nomi, è possibile aggiungere e rimuovere più eventi diversi.

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

ora con l'uso dello spazio dei nomi, è possibile aggiungere più di questi eventi e sono in grado di rimuoverli, a seconda delle proprie esigenze .. mentre submit potrebbe non essere il miglior esempio, questo potrebbe tornare utile su un clic o premere un tasto o altro ..


1

Questa non è una risposta diretta alla domanda, ma può aiutare qualcuno. Il mio punto è che si chiama preventDefault () solo in base ad alcune condizioni in quanto non ha senso avere un evento se si chiama preventDefault () per tutti i casi. Quindi avere if condizioni e chiamare preventDefault () solo quando le condizioni soddisfatte funzioneranno normalmente negli altri casi.

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

puoi usarlo dopo il metodo "preventDefault"

// Qui evt.target restituisce un evento predefinito (ad es. Url di default ecc.)

var defaultEvent=evt.target;

// Qui salviamo l'evento predefinito.

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

0

Puoi sempre usare questo allegato ad alcuni eventi click nel tuo script:

location.href = this.href;

esempio di utilizzo è:

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

-1

questo codice ha funzionato per me per ri-istanziare l'evento dopo che avevo usato:

event.preventDefault(); to disable the event.


event.preventDefault = false;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.