Pregunta

Lo siguiente es mi código de 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 en IE, esto funciona bien. Pero en IE, esto causa un error. Tengo IE8, así que mientras utilizaba su depurador de JavaScript, descubrí que el objeto event no tiene un método preventDefault 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í utilizando Firebug).

¿Alguna ayuda?

¿Fue útil?

Solución

en IE, puede 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();

Puede combinar los dos con:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

Otros consejos

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 obtenga un evento específico de IE que carece de preventDefault (), solo use este código para obtenerlo.

e = $.event.fix(e);

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

Sé que esta es una publicación bastante antigua, pero pasé 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 subprocesos 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 () el método existe debido a jQuery, pero no funciona (probablemente debido al punto a continuación), por lo que esto fallará.

Incluso si configuro la propiedad returnValue directamente en false:

$('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 me funciona es establecer la propiedad returnValue de variable global evento de 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.

UPDATE:

Como señala sv_in , puede usar event.originalEvent para obtener el original objeto de evento y establezca la propiedad returnValue en el original. Pero aún no lo he probado en mi IE8.

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

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

El documento 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í, es posible que desee probar

new Event(event).preventDefault();
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Probado en IE 9 y Chrome.

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; o return false;

Si intenta desactivar un método abreviado de teclado (con Ctrl, como Ctrl + F ), debe 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

Aquí hay una función que he estado probando con la compilación nocturna de jquery 1.3.2 y 09-18-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 de IE8 problemático 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;
})

preventDefault es un estándar generalizado; usar un adhoc cada vez que quiera cumplir con las versiones anteriores de IE es engorroso, es 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 puede utilizar e.preventDefault sin ningún problema.

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

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

FWIW, en caso de que alguien vuelva a consultar esta pregunta más adelante, también puede verificar lo que está entregando a la función del controlador onKeyPress.

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

Solo algo más para verificar.

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top