La función event.preventDefault () no funciona en IE

202

El siguiente es mi código JavaScript (mootools):

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

En todos los navegadores, excepto IE, esto funciona bien. Pero en IE, esto causa un error. Tengo IE8, así que al usar su depurador de JavaScript, descubrí que el eventobjeto no tiene un preventDefaultmétodo que esté causando el error y, por lo tanto, el formulario se está enviando. El método es compatible en el caso de Firefox (que descubrí usando Firebug).

¿Alguna ayuda?

sv_in
fuente
Lo hace; de acuerdo con los documentos ( mootools.net/docs/core/Native/Event#Event:preventDefault ) lo que tiene que debería funcionar: "Método de evento: preventDefault - Método de navegador cruzado para evitar la acción predeterminada del evento".
Paolo Bergantino
Lo malo es que eliminé mi comentario, que decía "¿los mootools no tienen un método para detener los eventos?". Así que hay un problema con los mootools en ie8 ...
Alsciende
2
No se puede reproducir este problema. Este violín "funciona para mí, es decir, 8" ¿Podría configurar un violín reducido para mostrar el error? jsfiddle.net
eerne

Respuestas:

472

en IE, puedes usar

event.returnValue = false;

para lograr el mismo resultado.

Y para no obtener un error, puede probar la existencia de preventDefault:

if(event.preventDefault) event.preventDefault();

Puedes combinar los dos con:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Alsciende
fuente
48
El siguiente código funcionó para mí: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in
229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy
31
Vale la pena señalar que "evento" debe ser el objeto de evento global en IE8. No puede usar el evento pasado al controlador de eventos, como e.preventDefault, debe ser event.preventDefault para que esto funcione en IE8.
jmort253
event.preventDefault();Dejé de trabajar para mí en Firefox por alguna razón, de la nada. Usé el código de mority y funcionó muy bien Gracias ~
James
8
Solo para agregar algo de claridad al comentario de @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke
23

Si vincula el evento a través de la función addEvent de mootools, su controlador de eventos obtendrá un evento fijo (aumentado) como parámetro. Siempre contendrá el método preventDefault ().

Pruebe este violín para ver la diferencia en el enlace de eventos. http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

Para todos los usuarios de jQuery , puede arreglar un evento cuando sea necesario. Digamos que usaste HTML onclick = ".." y obtienes un evento específico de IE que carece de preventDefault (), solo usa este código para obtenerlo.

e = $.event.fix(e);

Después de eso e.preventDefault (); funciona bien.

viejo mago
fuente
2
Lamentablemente, este truco no me funciona. Estoy usando IE 10 y antes de llamar a e.preventDefault (); Puedo llamar a $ .event.fix (e); sin éxito :(
Beatles1692
¿Podría haber sido eliminado de jquery 2? Pero IE10 no necesita la solución.
oldwizard
¿Asignó nuevamente el evento fijo a la variable e?
oldwizard
11

Sé que esta es una publicación bastante antigua, pero acabo de pasar un tiempo tratando de hacer que esto funcione en IE8.

Parece que hay algunas diferencias en las versiones de IE8 porque las soluciones publicadas aquí y en otros hilos no funcionaron para mí.

Digamos que tenemos este código:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

En mi IE8 preventDefault() método existe debido a jQuery, pero no funciona (probablemente debido al siguiente punto), por lo que esto fallará.

Incluso si configuro la returnValuepropiedad directamente en falso:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

Esto tampoco funcionará, porque acabo de establecer alguna propiedad del objeto de evento personalizado jQuery.

La única solución que funciona para mí es establecer la propiedad returnValuede la variable global de event esta manera:

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

Solo para que sea más fácil para alguien que intente convencer a IE8 de que trabaje. Espero que IE8 muera horriblemente en una muerte dolorosa pronto.

ACTUALIZAR:

Como señala sv_in , puede usar event.originalEventpara obtener el objeto de evento original y establecer la returnValuepropiedad en el original. Pero aún no lo he probado en mi IE8.

muffir
fuente
1
También puede obtener el objeto de evento del navegador original event.originalEvent. Más información: stackoverflow.com/a/16675056/22550
sv_en
6

Mootools redefine preventDefault en los objetos de evento. Por lo tanto, su código debería funcionar bien en todos los navegadores. Si no es así, entonces hay un problema con el soporte de ie8 en mootools.

¿Probaste tu código en ie6 y / o ie7?

El doctor dice

Cada evento agregado con addEvent obtiene el método mootools automáticamente, sin la necesidad de instanciarlo manualmente.

pero en caso de que no sea así, puede intentar

new Event(event).preventDefault();
Alsciende
fuente
1
Hubo algún problema al envolver así también en IE. ¡Oh Dios mío! ¿Por qué IE?
sv_in
Sin embargo, no quiere detener el evento, solo evitar su acción predeterminada.
Alsciende
5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Probado en IE 9 y Chrome.

RolandoCC
fuente
2
No funciona en IE 11 (e.preventDefault es una función, aunque no parece hacer nada)
GreySage
4

Para deshabilitar una tecla del teclado después de IE9, use: e.preventDefault();

Para deshabilitar una tecla de teclado normal en IE7 / 8, use: e.returnValue = false;oreturn false;

Si intenta deshabilitar un atajo de teclado (con Ctrl, me gusta Ctrl+F) necesita agregar esas líneas:

try {
    e.keyCode = 0;
}catch (e) {}

Aquí hay un ejemplo completo solo para IE7 / 8:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

Referencia: Cómo deshabilitar los atajos de teclado en IE7 / IE8

JBE
fuente
Eres el único respondedor que da en el clavo. La única razón por la que alguien aquí está hablando de los primeros IE es porque necesitan funcionalidad multiplataforma. "e.keyCode = 0;" matará cualquier acción predeterminada al principio de IE.
www-0av-Com
3

Aquí hay una función que he estado probando con jquery 1.3.2 y la compilación nocturna del 18/09/2009. Déjame saber tus resultados con él. Todo se ejecuta bien en este extremo en Safari, FF, Opera en OSX. Es exclusivamente para corregir un error problemático de IE8 y puede tener resultados no deseados:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

Uso:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})
Eliran Malka
fuente
1
Nunca stopantes había visto este método, y no pude encontrarlo en msdn. ¿Qué hace?
Oriol
1
.stop()lanza una excepción, porque no existe. Cualquier excepción tendrá el efecto deseado.
Jay Bazuzi
¿Y por qué querrías lanzar una excepción? Quiero decir, si quieres lanzar una excepción, simplemente puedes llamar e.preventDefault()porque arrojaría una excepción de todos modos ...
Matthias Burger
2

preventDefaultes un estándar generalizado; Usar un ad hoc cada vez que quiera cumplir con las versiones antiguas de IE es engorroso, mejor usar un polyfill:

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

Esto modificará el prototipo del Evento y agregará esta función, una gran característica de javascript / DOM en general. Ahora puedes usar e.preventDefaultsin problema.

EliuX
fuente
0

return false en su oyente debería funcionar en todos los navegadores.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}
daemon1981
fuente
0

FWIW, en caso de que alguien revise esta pregunta más tarde, también puede verificar lo que está entregando a su función de controlador onKeyPress.

Me encontré con este error cuando pasé por error onKeyPress (esto) en lugar de onKeyPress (evento).

Solo algo más para verificar.

Kirby L. Wallace
fuente
0

Me ayudó un método con una verificación de función. Este método funciona en IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Pablo
fuente