javascript - window.onerror no dispara en Firefox
jquery (3)
Lo siguiente está probado y funcionando en IE 6 y Firefox 3.0.11:
<html>
<head>
<title>Title</title>
</head>
<body>
<script type="text/javascript">
window.onerror = function (msg, url, num) {
alert(msg + '';'' + url + '';'' + num);
return true;
}
</script>
<div>
...content...
</div>
<script type="text/javascript">
blah;
</script>
</body>
</html>
Si alguna otra biblioteca de JavaScript que está cargando también se window.onerror
a window.onerror
puede hacer esto:
<script type="text/javascript">
function addHandler(obj, evnt, handler) {
if (obj.addEventListener) {
obj.addEventListener(evnt.replace(/^on/, ''''), handler, false);
// Note: attachEvent fires handlers in the reverse order they
// were attached. This is the opposite of what addEventListener
// and manual attachment do.
//} else if (obj.attachEvent) {
// obj.attachEvent(evnt, handler);
} else {
if (obj[evnt]) {
var origHandler = obj[evnt];
obj[evnt] = function(evt) {
origHandler(evt);
handler(evt);
}
} else {
obj[evnt] = function(evt) {
handler(evt);
}
}
}
}
addHandler(window, ''onerror'', function (msg, url, num) {
alert(msg + '';'' + url + '';'' + num);
return true;
});
addHandler(window, ''onerror'', function (msg, url, num) {
alert(''and again '' + msg + '';'' + url + '';'' + num);
return true;
});
</script>
Lo anterior le permite adjuntar tantos controladores de onerror
como desee. Si ya existe un controlador onerror
personalizado, invocará ese y luego el tuyo.
Tenga en cuenta que addHandler()
se puede usar para vincular varios controladores a cualquier evento:
addHandler(window, ''onload'', function () { alert(''one''); });
addHandler(window, ''onload'', function () { alert(''two''); });
addHandler(window, ''onload'', function () { alert(''three''); });
Este código es nuevo y algo experimental. No estoy 100% seguro de que addEventListener haga exactamente lo que hace el adjunto manual, y como comenté, attachEvent enciende los manejadores en el orden inverso al que fueron adjuntados (por lo que vería ''tres, dos, uno'' en el ejemplo anterior). Si bien no es necesariamente "incorrecto" o "incorrecto", es lo opuesto a lo que hace el otro código en addHandler
y, como resultado, podría dar lugar a un comportamiento incoherente de un navegador a otro, razón por la cual lo addHandler
.
EDITAR:
Este es un caso de prueba completo para demostrar el evento onerror:
<html>
<head>
<title>Title</title>
</head>
<body>
<script type="text/javascript">
function addHandler(obj, evnt, handler) {
if (obj.addEventListener) {
obj.addEventListener(evnt.replace(/^on/, ''''), handler, false);
} else {
if (obj[evnt]) {
var origHandler = obj[evnt];
obj[evnt] = function(evt) {
origHandler(evt);
handler(evt);
}
} else {
obj[evnt] = function(evt) {
handler(evt);
}
}
}
}
addHandler(window, ''onerror'', function (msg, url, num) {
alert(msg + '';'' + url + '';'' + num);
return true;
});
</script>
<div>
...content...
</div>
<script type="text/javascript">
blah;
</script>
</body>
</html>
Cuando el código anterior se coloca en test.htm y se carga en Internet Explorer desde los idks locales, debería ver un cuadro de diálogo que dice que ''blah'' is undefined;undefined;undefined
.
Cuando el código anterior se coloca en test.htm y se carga en Firefox 3.0.11 (y el último 3.5 a partir de esta edición - Gecko / 20090616) desde el disco local, debería ver un cuadro de diálogo que dice [object Event];undefined;undefined
. Si eso no sucede, su copia de Firefox no está configurada correctamente o está rota. Todo lo que puedo sugerir es que elimine Firefox, elimine sus perfiles locales ( here encontrará información sobre cómo encontrar su perfil), reinstale la última versión y vuelva a realizar la prueba.
Estoy tratando de crear una infraestructura de registro de errores javascript.
Estoy tratando de configurar window.onerror
para que sea mi controlador de errores. Funciona en IE 6, pero cuando lo ejecuto en Firefox, se ejecuta en algún método onerror
conflictivo.
var debug = true;
MySite.Namespace.ErrorLogger.prototype = {
//My error handling function.
//If it''s not in debug mode, I should get an alert telling me the error.
//If it is, give a different alert, and let the browser handle the error.
onError: function(msg, url, lineNo) {
alert(''onError: '' + msg);
if (!debug) {
alert(''not debug mode'');
return true;
}
else {
alert(msg);
return false;
}
}
}
//Document ready handler (jQuery shorthand)
$(function() {
log = $create(MySite.Namespace.ErrorLogger);
window.onerror = log.onError;
$(window).error(function(msg, url, line) {
log.onError(msg, url, line);
});
});
Si uso setTimeout("eval(''a'')", 1);
donde '' a
'' es una variable no definida, mi controlador de errores es lo que se activa (funciona). Sin embargo, mi registrador de errores necesita detectar todos los errores que cometen los clientes que acceden al sitio web, no solo el código incorrecto en un solo lugar.
El código está en una página .js a la que se llama desde la página base (C #) de un sitio web. El sitio también usa jQuery, así que tengo una función que reemplaza la función de enlace jQuery, y esa función funciona bien tanto en Firefox 3 como en IE 6.
Sé que Firefox está viendo el error porque aparece tanto en la Consola de errores como en Firebug, pero todavía no se está llamando a mi función window.onerror
.
¿Alguna idea sobre cómo anular lo que está haciendo Firefox?
Parece que hay un error abierto (# 3982) en jQuery 1.3.x - el evento jQuery.error obtiene argumentos incorrectos . La última actualización fue hace 2 meses con el comentario:
Dado lo loco que es el evento de error y con qué frecuencia se usa, estoy de acuerdo en que es más fácil eliminar el soporte para él. He agregado una nota a los documentos ya que no funcionó de todos modos.
Supongo que me gustaría configurar window.onerror yo mismo, similar a lo que Grant publicó. Además, FireFox: addEventListener Vs. window.onerror menciona que "element.addEventListener", causando un error no activa "window.onerror" .
Recuerde devolver verdadero desde cualquier controlador window.onerror personalizado, o Firefox lo manejará de todos modos.