¿Qué es lo contrario de evt.preventDefault ();

185

Una vez que haya disparado evt.preventDefault(), ¿cómo puedo reanudar las acciones predeterminadas nuevamente?

Bryan
fuente
3
Creo que normalmente su función se ejecutará y luego se ejecutará el comportamiento predeterminado, por lo que nunca llamaría evt.preventDefault () en primer lugar
Prescott
1
Posible duplicado? : stackoverflow.com/questions/1551389/…
Nobita
2
@Nobita - No estoy tan seguro ... que uno sea específico de jQuery.
gilly3
1
¡Guau, gracias por las respuestas rápidas! Sin embargo, mi problema es que no soy yo quien dispara evt.preventDefault () ;. Estoy ejecutando una aplicación flash de terceros en una caja de luz. Cuando cierro la caja de luz, de alguna manera se detiene la rueda del mouse para desplazar la página. Al investigar un poco, descubrí que esta aplicación flash deshabilita el desplazamiento de la página debido a una función de zoom. Así que ahora estoy tratando de reanudar el desplazamiento de la página una vez que se cierra la aplicación. ¿Quizás haya algún método al que pueda llamar para reanudar el evento de la rueda del mouse?
Bryan
1
posible duplicado de Cómo volver a habilitar event.preventDefault?
Richard Ev

Respuestas:

90

Según lo comentado por @Prescott, lo contrario de:

evt.preventDefault();

Podría ser:

Esencialmente equivale a 'hacer predeterminado' , ya que ya no lo estamos evitando.

De lo contrario, me inclino a señalar las respuestas proporcionadas por otros comentarios y respuestas:

¿Cómo desvincular un escucha que está llamando a event.preventDefault () (usando jQuery)?

¿Cómo volver a habilitar event.preventDefault?

Tenga en cuenta que el segundo ha sido aceptado con una solución de ejemplo, dada por redsquare (publicado aquí para una solución directa en caso de que esto no se cierre como duplicado):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});
Grant Thomas
fuente
¡Gracias! Me estaba rascando la cabeza por un tiempo al respecto (necesitaba detenerme y verificar algunas cosas antes de enviar un formulario, no enviar en ciertas circunstancias, enviar en otras).
Katharine Osborne
1
Funciona, pero no entiendo por qué el siguiente formulario enviar llama a la función nuevamente, pensé que lo desvincularía definitivamente, pero parece que se desvincula solo para la llamada actual ... No puedo explicarlo, lo hace exactamente lo que quiero pero no es lo que esperaba.
Vadorequest
53
function(evt) {evt.preventDefault();}

y su opuesto

function(evt) {return true;}

¡salud!

foxybagga
fuente
8
Esto funcionó para mí, pero me pregunto si alguien puede explicarlo un poco mejor por qué.
bordes
11
Esto no deshace preventDefault (), de hecho, hace lo mismo que si omitiera return true: nada.
br4nnigan
19

Para procesar un comando antes de continuar un enlace desde un clickevento en jQuery:

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

Prevenir y seguir 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 simplemente correr window.location = this.href;tras elpreventDefault();

Bradley Flood
fuente
3
Correcto, pero esto supone que preventDefault es un enlace, y no dice touchmove en el cuerpo del documento.
Bangkokiano
44
Esto no es lo que hizo la pregunta.
Matt Fletcher
8

Tuve que retrasar el envío de un formulario en jQuery para ejecutar una llamada asincrónica. Aquí está el 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
fuente
Otra opción en este escenario podría ser usar input type = "button" y enlazar al evento click en lugar de usar input type = "submit" y enlazar al evento submit.
Strixy
8

OKAY ! funciona para el 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 !

});
Web de SNS
fuente
4

Sugeriría el siguiente patrón:

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 me falte algo.

http://jsfiddle.net/DdvcX/

karim79
fuente
4

No hay un método opuesto event.preventDefault()para entender por qué primero tienes que mirar qué event.preventDefault()hace cuando lo llamas.

Debajo del capó, la funcionalidad para preventDefault es esencialmente llamar a un retorno falso que detiene cualquier ejecución posterior. Si está familiarizado con las viejas formas de Javascript, alguna vez estuvo de moda usar return false para cancelar eventos en cosas como envíos de formularios y botones usando return true (incluso antes de que jQuery existiera).

Como probablemente ya haya trabajado en base a la explicación simple anterior: lo contrario de event.preventDefault()es nada. Simplemente no evita el evento, de forma predeterminada el navegador lo permitirá si no lo está evitando.

Vea a continuación una explicación:

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

En el código anterior, notará que estamos verificando si allowSubmit es falso. Esto significa que event.preventDefaultevitaremos que nuestro formulario se envíe usando y luego haremos alguna lógica de validación y, si estamos contentos, establezca allowSubmit en verdadero.

Este es realmente el único método efectivo para hacer lo contrario event.preventDefault(): también puede intentar eliminar eventos que esencialmente lograrían lo mismo.

Partha
fuente
4

Aquí hay algo útil ...

En primer lugar, haremos clic en el enlace, ejecutaremos un código y luego realizaremos una acción predeterminada. Esto será posible usando event.currentTarget Echa un vistazo. Aquí intentaremos acceder a Google en una nueva pestaña, pero antes de que necesitemos ejecutar algún 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
fuente
2

Esto es lo que solía configurarlo:

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

Y para deshacerlo:

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

Ninguna de las soluciones me ayudó aquí e hice esto para resolver mi situación.

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

Y la función 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
fuente
2

Supongo que lo "opuesto" sería simular un evento. Podrías usar.createEvent()

Siguiendo el ejemplo de 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


jQuery tiene .trigger()para que pueda desencadenar eventos en elementos, a veces útiles.

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

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

jquery on () podría ser otra solución para esto. especialmente cuando se trata del uso de espacios de nombres .

jquery on () es solo la forma actual de vincular eventos (en lugar de bind ()). off () es desvincular estos. y cuando usa un espacio de nombres, puede agregar y eliminar múltiples 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");
    }
});

ahora con el uso del espacio de nombres, puede agregar varios de estos eventos y puede eliminarlos, según sus necesidades.

honk31
fuente
1

Esta no es una respuesta directa a la pregunta, pero puede ayudar a alguien. Mi punto es que solo llama a preventDefault () en función de algunas condiciones, ya que no tiene sentido tener un evento si llama a preventDefault () para todos los casos. Por lo tanto, tener condiciones if y llamar a preventDefault () solo cuando se cumplan las condiciones funcionará la función de la manera habitual para los otros 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
fuente
0

puede usar esto después del método "preventDefault"

// Aquí evt.target return evento predeterminado (por ejemplo: url defult, etc.)

var defaultEvent=evt.target;

// Aquí guardamos el evento predeterminado ...

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

Siempre puede usar esto adjunto a algún evento de clic en su script:

location.href = this.href;

ejemplo de uso es:

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

este código me funcionó para volver a crear una instancia del evento después de haber usado:

event.preventDefault(); to disable the event.


event.preventDefault = false;
LCMr_music
fuente
-2

He usado el siguiente código. Funciona bien para mí.

$('a').bind('click', function(e) {
  e.stopPropagation();
});
VeeraPrasad
fuente
2
Como se explica en la documentación de la API jQuery , esto evita que el evento forme burbujas en el árbol DOM, evitando que cualquier controlador principal sea notificado del evento. Eso no es lo mismo que / o lo contrario de event.preventDefault();
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
2
Esto tampoco es lo que se hizo la pregunta.
Matt Fletcher