2009-10-11 11 views
120

jquery alternar llamadas preventDefault() de forma predeterminada, por lo que los valores predeterminados no funcionan. no puede hacer clic en una casilla de verificación, no puede hacer clic en un enlace, etc.Cómo desvincular un oyente que está llamando a event.preventDefault() (utilizando jQuery)?

¿es posible restablecer el controlador predeterminado?

+0

¿Puede dar un código de ejemplo? – Jojo

+1

¡La pregunta en el título es fantástica! Lástima que la pregunta real no es ... esperaba encontrar aquí, la respuesta a cómo (si es posible) podemos 'deshacer' el efecto de 'prevenirDefault' después de haber sido llamado. Actualmente, esta pregunta es en realidad '¿cómo desacopla un oyente de eventos con jQuery?'. –

Respuesta

8

en algunos casos * inicialmente puede return false en lugar de e.preventDefault(), luego cuando desea restaurar el valor predeterminado a return true.

* es decir, cuando no le importa el burbujeo de eventos y que no utiliza el e.stopPropagation() junto con e.preventDefault()

Véase también similar question (también en desbordamiento de pila)

o en el caso de que la casilla de verificación puede tener algo como:

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

no es posible restaurar una preventDefault() pero lo que puede hacer es engañar a él :)

<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> 

Si quieres dar un paso más, incluso puedes usar el botón disparador para activar un evento.

+0

Estoy bastante seguro de que es - Lo hice en un diseño recientemente. Al principio, al hacer clic en un botón, evité el desplazamiento en un iphone agregando e.preventDefault en el evento touchmove y luego, una vez que la animación finalizó, devolví la verdad y funcionó como un amuleto. – foxybagga

51

Su bastante simple

vamos a suponer que usted hace algo así como

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

ahora para volver a la situación original, hacer el siguiente ...

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

De esta website.

+0

Esta solución no funciona después de $ ('# a_link'). Haga clic en (función (e) { e.preventDefault(); }); use la función de desvinculación. –

+1

El enlace que proporcionó está roto. – Stacked

-9

no estoy seguro de que eres lo que quiere decir: pero aquí es una solución para un problema similar (y posiblemente el mismo) ...

A menudo uso preventDefault() para interceptar artículos. Sin embargo, no es el único método de interceptación ... a menudo es posible que desee una "pregunta" sobre qué comportamiento continúa como antes o si se detiene. En un caso reciente que utiliza la siguiente solución:

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

Básicamente, el "prevenir defecto" tiene la intención de interceptar y hacer otra cosa: el "confirmar" está diseñado para su uso en ... bueno - confirmando!

+0

Estoy seguro de que no obtiene la pregunta correcta – Stacked

71

En mi caso:

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

$('#some_link').unbind('click'); funcionó como el único método para restaurar la acción predeterminada.

Como se ve aquí: https://stackoverflow.com/a/1673570/211514

+1

Si este elemento tiene otro manejador de clics, desvinculará todos los eventos adjuntos, no solo se evitó el manejador ... – Aure77

1

Desactivar:

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

Habilitar:

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

puede restaurar la acción por defecto (si es un seguimiento HREF) al hacer esto:

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

+2

ideas eran correctas, pero el código no funcionaba para mí (a menos que sea solo un cambio de sintaxis en jquery) utilicé: window.location = $ (this) .attr ('href'); – Modika

1

probar este código, creo que a resolver su problema:

event.stopPropagation(); 

Reference

+1

Esto no funcionó para mí, utilicé 'unbind' en su lugar. – Micer

+0

tiene que detener Propagation en un controlador que se produce antes del controlador que impide el valor predeterminado. Puede hacer esto en la fase de captura si su otro controlador está registrado en la fase de burbuja. –

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

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

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

La forma en que funcionó para mí fue: $ (document) .off ('touchmove'); $ (document) .on ('touchmove', function() {return true;}); – rogervila

0

que tenía un problema en el que necesitaba la acción predeterminada sólo después de algún tipo de acción personalizada (habilitar campos de entrada de otro modo con discapacidad en un formulario) había concluido. Envolví la acción predeterminada (submit()) en una función recursiva propia (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

Nota general: Si bien algunos codificadores creen que 'if (predef == true)' es más explícito, está agregando 7 caracteres a su código JS sin ningún motivo. 'if (prevdef)' es igual de legible. Además, ha agregado un controlador de eventos anónimo redundante cuando '.click (dosubmit)' hace lo mismo que '.click (function() {dosubmit()})' ya que no se pasan parámetros. –

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

La mejor manera de hacer esto mediante el uso de espacio de nombres. Es una forma segura y segura. Aquí .rb es el espacio de nombres que asegura que la función de desvinculación funciona en esa clave en particular pero no en otras.

$(document).bind('keydown.rb','Ctrl+r',function(e){ 
      e.stopImmediatePropagation(); 
      return false; 
     }); 

$(document).unbind('keydown.rb'); 

REF1: http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/

REF2: http://jqfundamentals.com/chapter/events

1

si se trata de un enlace a continuación $(this).unbind("click"); sería volver a habilitar el enlace y pulsando el comportamiento por defecto serían restaurados.

He creado a demo JS fiddle para demostrar cómo funciona esto:

Este es el código del violín de 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

Utilice un booleano:

let prevent_touch = true; 
document.documentElement.addEventListener('touchmove', touchMove, false); 
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
} 

Utilizo esto en una aplicación web progresiva para evitar el desplazamiento/acercamiento de algunas "páginas" y permitir otras.

0

Puede configurar para formar 2 clases. Después de configurar su secuencia de comandos JS a uno de ellos, cuando desee deshabilitar su secuencia de comandos, simplemente elimine la clase con secuencia de comandos enlazada de este formulario.

HTML:

<form class="form-create-container form-create"> </form> 

JS

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit(); 

}); 
Cuestiones relacionadas