2012-04-09 10 views
8

Estoy tratando de depurar una aplicación de IE Intranet muy compleja. Recibo una alerta con un mensaje personalizado que indica que se ha producido una excepción. Me gustaría obtener más información sobre esta excepción ya que el mensaje no es muy útil.¿Cómo detectar de dónde viene la alerta de JavaScript?

Hay una página maestra que contiene una gran cantidad de iFrames (y archivos .htc si eso hace la diferencia), así que no creo que pueda probar y hijack window.alert. Mi último recurso será probar suerte con una búsqueda de archivos.

Utilizando IE 8, ¿puedo detectar de todos modos de dónde viene esta alerta? La solución ideal sería crear de alguna manera una función "breakOnAlert" que inserte una instrucción debbuger en la ubicación de alerta correcta.

Para aclarar: La página maestra contiene muchos iframes y creo que el error + alerta proviene de uno de estos. Cada iframe es una página aspx (a veces con html/javascript dinámico del usuario) y contiene JavaScript en línea y externo. Antes de publicar intenté sobrescribir alerta en mi página (una página secundaria dentro de un iframe) pero no funcionó. Supongo que No funciona, ya que cada iframe tiene su propio objeto de ventana, por lo que cada uno tiene su propia versión de alerta . Para que esto funcione, necesitaría encontrar todos los iframes y anularlos para cada uno, algo que creo que sería muy complicado de hacer. En las herramientas de desarrollo de IE puedo ver una gran cantidad de archivos de script (en línea y externos), por lo que sería muy difícil buscar las alertas allí de forma manual.

+0

fuera de tema, pero por favor enviar el código para thedailywtf.com –

Respuesta

5

Dado que se trata de una tarea real de hacerlo en todos los marcos flotantes, probablemente me utilizo Fiddler y programáticamente reemplazar alert( con algo como:

(function(n){alert(n);debugger;})(

IE deben apoyar la declaración debugger, por lo que tendría una pila de llamadas

This page explica cómo hacer un texto-reemplazar en Fiddler

Ejemplo violinista regla personalizada para añadir a OnBeforeResponse:

if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")) 
{ 
    oSession.utilDecodeResponse(); 
    var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes); 
    oBody = oBody.replace(/alert\(/gi, "(function(n){alert(n);debugger;})("); 
    oSession.utilSetResponseBody(oBody); 
} 
+0

Gran solución. He actualizado su respuesta (en espera de aprobación) con una regla de Fiddler en funcionamiento. Gracias. – row1

1

Ovveride función de alerta y establecer un punto de interrupción en el interior, a continuación, se puede ver Seguimiento de la pila :)

function alert(message) { 
    var x = 'whatever'; 
} 


$(function() { 
    alert('test'); 
}); 
+1

Hola, como se ha mencionado que Don No creo que esto funcione debido a todos los iFrames. Lo intenté antes de publicar la pregunta, pero supongo que no funciona porque cada cuadro tendrá su propia ventana .alert() Tendría que anularlos a todos. – row1

+0

Entonces gracias por esta información :) No sabía eso. –

Cuestiones relacionadas