El siguiente es probado y funciona 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 librería JavaScript que va a cargar también se adhiera a window.onerror
usted 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 conectar tantos manejadores onerror
como desee. Si ya existe un controlador personalizado onerror
, lo invocará, luego el suyo.
Tenga en cuenta que addHandler()
se puede utilizar para unir varios controladores a cualquier acontecimiento:
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 hace exactamente lo que hace el archivo adjunto manual, y como se comentó, attachEvent dispara los controladores en el orden inverso al que estaban adjuntos (por lo que vería 'tres, dos, uno' en el ejemplo anterior). Si bien no necesariamente es "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 entre el navegador y el navegador, por lo que lo eliminé.
EDIT:
Este es un caso de prueba completa 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 pone en test.htm y se carga en Internet Explorer desde los idks locales, se debería ver un cuadro de diálogo que dice 'blah' is undefined;undefined;undefined
.
Cuando el código anterior se pone en test.htm y se carga en Firefox 3.0.11 (y los últimos 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 está sucediendo, tu copia de Firefox no está configurada correctamente o rota de algún otro modo. Todo lo que puedo sugerir es que elimines Firefox, elimines tus perfiles locales (la información sobre cómo encontrar tu perfil está disponible here) y vuelves a instalar la última versión y vuelves a probar.
Alguien más en mi grupo se hizo cargo de este proyecto y cambió por completo todo lo que estaba haciendo, así que nunca sabré lo que estaba mal. –