javascript - react - La función event.preventDefault() no funciona en IE
preventdefault not working (11)
Esta es una función que he estado probando con jquery 1.3.2 y 09-18-2009 de compilación nocturna. 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;
})
El 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 de 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?
FWIW, en caso de que alguien vuelva a consultar 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).
Sólo algo más para comprobar.
Me ayudó un método con una función de verificación. Este método funciona en IE8.
if(typeof e.preventDefault == ''function''){
e.preventDefault();
} else {
e.returnValue = false;
}
Mootools redefine preventDefault en objetos de evento. Así que su código debería funcionar bien en todos los navegadores. Si no es así, entonces hay un problema con el soporte ie8 en mootools.
¿Probaste tu código en ie6 y / o ie7?
El doc 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í, tal vez quieras intentarlo.
new Event(event).preventDefault();
Para deshabilitar una tecla del teclado después de IE9, use: e.preventDefault();
Para deshabilitar una tecla de teclado normal bajo IE7 / 8, use: e.returnValue = false;
o return false;
Si intenta deshabilitar un método abreviado de teclado (con Ctrl, como Ctrl+F
), necesita agregar esas líneas:
try {
e.keyCode = 0;
}catch (e) {}
Aquí hay un ejemplo completo para IE7 / 8 solamente:
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
Sé que esta es una publicación bastante antigua, pero pasé un tiempo tratando de hacer que esto funcionara en IE8.
Parece que hay algunas diferencias en las versiones de IE8 porque las soluciones publicadas aquí y en otros subprocesos no me funcionaron.
Digamos que tenemos este código:
$(''a'').on(''click'', function(event) {
event.preventDefault ? event.preventDefault() : event.returnValue = false;
});
En mi IE8, el preventDefault()
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 un event
variable global como este:
$(''a'').on(''click'', function(event) {
if (window.event) {
window.event.returnValue = false;
}
event.preventDefault();
});
Solo para facilitar que alguien que intente convencer a IE8 funcione. Espero que IE8 muera horriblemente en muerte dolorosa pronto.
ACTUALIZAR:
Como señala , puede usar event.originalEvent
para obtener el objeto de evento original y establecer la propiedad returnValue
en el original. Pero no lo he probado en mi IE8 todavía.
Si vincula el evento a través de la función addEvent de mootools, su controlador de eventos obtendrá un evento fijo (aumentado) pasado 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 , puedes 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.
en IE, puedes usar
event.returnValue = false;
Para lograr el mismo resultado.
Y para no recibir 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);
preventDefault
es un estándar generalizado; usar un adhoc 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 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;
}
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
Probado en IE 9 y Chrome.