Qual é o oposto de evt.preventDefault ();

185

Depois de disparar um evt.preventDefault(), como posso retomar as ações padrão novamente?

Bryan
fonte
3
Eu acho que normalmente a sua função seria executado e, em seguida, o comportamento padrão seria executado, assim você nunca chamaria evt.preventDefault () em primeiro lugar
Prescott
1
Possível duplicado? : stackoverflow.com/questions/1551389/…
Nobita
2
@ Nobita - Eu não tenho tanta certeza ... que um é específico para jQuery.
precisa saber é o seguinte
1
Uau, obrigado pelas respostas rápidas! Meu problema é que não fui eu quem disparou o evt.preventDefault () ;. Estou executando um aplicativo flash de terceiros em uma mesa de luz. Quando fecho a mesa de luz, de alguma forma a roda do mouse para a rolagem da página pára. Ao fazer algumas pesquisas, descobri que este aplicativo flash desabilita a rolagem de páginas devido a um recurso de zoom. Então agora estou tentando retomar a rolagem da página depois que o aplicativo é fechado. Talvez haja algum método que eu possa chamar para retomar o evento da roda do mouse?
Bryan
1
possível duplicata de Como reativar event.preventDefault?
Richard Ev

Respostas:

90

Conforme comentado por @Prescott, o oposto de:

evt.preventDefault();

Poderia ser:

Equivale essencialmente a 'fazer o padrão' , já que não o estamos impedindo.

Caso contrário, estou inclinado a apontar as respostas fornecidas por outros comentários e respostas:

Como desvincular um ouvinte que está chamando event.preventDefault () (usando jQuery)?

Como reativar event.preventDefault?

Observe que a segunda foi aceita com uma solução de exemplo, fornecida por redsquare (postada aqui para uma solução direta, caso ela não seja fechada como duplicada):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});
Grant Thomas
fonte
Obrigado! Estava coçando a cabeça por um tempo nisso (eu precisava parar e verificar algumas coisas antes do envio de um formulário, não enviando em determinadas circunstâncias, enviando em outras).
Katharine Osborne
1
Funciona, mas não entendo por que o próximo formulário enviar chama a função novamente. Pensei que seria desvinculado definitivamente, mas parece que ele seria desvinculado apenas da chamada atual ... Não sei explicar, é exatamente o que eu quero, mas não é o que eu esperava.
Vadorequest
53
function(evt) {evt.preventDefault();}

e seu oposto

function(evt) {return true;}

Felicidades!

foxybagga
fonte
8
Isso funcionou para mim, mas estou me perguntando se alguém pode explicar um pouco melhor o porquê.
Edchedges
11
Isso não desfaz preventDefault (), na verdade, faz o mesmo como se você omitisse o return true: nothing.
Br4nnigan # 15/17
19

Para processar um comando antes de continuar um link de um clickevento no jQuery:

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

Impeça e siga com o 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");
    }
});

Ou simplesmente corra window.location = this.href;atrás dopreventDefault();

Bradley Flood
fonte
3
Certo, mas isso pressupõe que o preventDefault seja um link, e não diga touchmove no corpo do documento.
Bangkokian 6/09/15
4
Não é isso que a pergunta é feita.
Matt Fletcher
8

Eu tive que atrasar o envio de um formulário no jQuery para executar uma chamada assíncrona. Aqui está o código simplificado ...

$("$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();
    });
});
Bobby Pearson
fonte
Outra opção nesse cenário pode ser usar o tipo de entrada = "botão" e vincular ao evento click em vez de usar o tipo de entrada = "enviar" e vincular ao evento de envio.
Strixy
8

ESTÁ BEM ! funciona para o 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 !

});
SNS Web
fonte
4

Eu sugeriria o seguinte padrão:

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 menos que esteja faltando alguma coisa.

http://jsfiddle.net/DdvcX/

karim79
fonte
4

Não existe um método oposto de event.preventDefault()entender por que você primeiro precisa examinar o que event.preventDefault()faz quando o chama.

Sob o capô, a funcionalidade para preventDefault está essencialmente chamando um retorno false, que interrompe qualquer execução adicional. Se você está familiarizado com as formas antigas de Javascript, era uma vez na moda usar return false para cancelar eventos em itens como envios de formulários e botões usando return true (antes do jQuery aparecer).

Como você provavelmente já deve ter trabalhado com base na simples explicação acima: o oposto de event.preventDefault()nada é. Você simplesmente não impede o evento; por padrão, o navegador permitirá o evento se você não o estiver impedindo.

Veja abaixo uma explicação:

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

No código acima, você notará que estamos verificando se allowSubmit é falso. Isso significa que impediremos o envio do formulário event.preventDefaulte, em seguida, faremos alguma lógica de validação. Se estivermos felizes, defina allowSubmit como true.

Este é realmente o único método eficaz de fazer o oposto de event.preventDefault()- você também pode tentar remover eventos, o que essencialmente alcançaria a mesma coisa.

Partha
fonte
4

Aqui está algo útil ...

Primeiro, clicamos no link, executamos algum código e depois executamos a ação padrão. Isso será possível usando event.currentTarget Dê uma olhada. Aqui, tentaremos acessar o Google em uma nova guia, mas antes precisamos executar algum código.

<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>
Rafael Xavier
fonte
2

Isto é o que eu costumava definir:

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

E para desfazê-lo:

$("body").unbind("touchmove");
Joe McLean
fonte
2

Nenhuma das soluções me ajudou aqui e fiz isso para resolver minha situação.

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

E a função 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();
}
Raza
fonte
2

Suponho que o "oposto" seria simular um evento. Você poderia usar.createEvent()

Seguindo o exemplo da 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");
  }
}

Ref: document.createEvent


O jQuery possui .trigger()para que você possa disparar eventos em elementos - às vezes úteis.

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

$('#foo').trigger('click');
Gary Green
fonte
1

jquery on () poderia ser outra solução para isso. escpacialmente quando se trata do uso de espaços para nome .

jquery on () é apenas a maneira atual de vincular eventos (em vez de bind ()). off () é desvincular estes. e quando você usa um espaço para nome, você pode adicionar e remover vários eventos diferentes.

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

agora, com o uso do namespace, você pode adicionar vários desses eventos e removê-los, dependendo de suas necessidades. Embora o envio não seja o melhor exemplo, isso pode ser útil com um clique ou pressionamento de tecla ou o que for ..

honk31
fonte
1

Esta não é uma resposta direta para a pergunta, mas pode ajudar alguém. O que quero dizer é que você chama apenas preventDefault () com base em algumas condições, pois não há sentido em ter um evento se você chamar preventDefault () para todos os casos. Portanto, ter condições e chamar preventDefault () apenas quando as condições satisfeitas funcionarão da maneira usual para os outros casos.

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

});

Peck_conyon
fonte
0

você pode usar isso após o método "preventDefault"

// Aqui evt.target retorna o evento padrão (por exemplo: defult url etc)

var defaultEvent=evt.target;

// Aqui salvamos o evento padrão ..

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

Você sempre pode usar isso anexado a algum evento de clique em seu script:

location.href = this.href;

exemplo de uso é:

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

esse código funcionou para eu re-instanciar o evento após o uso:

event.preventDefault(); to disable the event.


event.preventDefault = false;
LCMr_music
fonte
-2

Eu usei o seguinte código. Isso funciona bem para mim.

$('a').bind('click', function(e) {
  e.stopPropagation();
});
VeeraPrasad
fonte
2
Conforme explicado na documentação da API do jQuery , isso evita que o evento borbulhe na árvore DOM, impedindo que qualquer manipulador pai seja notificado sobre o evento. Isso não é o mesmo que / ou o oposto de event.preventDefault();
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
2
Não é isso que a pergunta também.
Matt Fletcher