2010-07-19 19 views
9

En cualquier lenguaje de programación, puedo rastrear cualquier función y saber qué función es llamada por otra. Pero en Javascript, no sé cómo, desde el código no está escrito por mí y Firebug no da esta función, hasta donde yo sé.Cómo rastrear eventos Javascript (Stack Trace)?

Un ejemplo:

Quiero mostrar los nombres de las funciones de cada función que se llama cuando se hace clic sobre el factor XYZ, y los muestra en orden.

Gracias.

Respuesta

10

encontrado esto: A javascript stacktrace in any browser, James dice que tienen un github account now

function printStackTrace() { 
    var callstack = []; 
    var isCallstackPopulated = false; 
    try { 
    i.dont.exist+=0; //doesn't exist- that's the point 
    } catch(e) { 
    if (e.stack) { //Firefox 
     var lines = e.stack.split('\n'); 
     for (var i=0, len=lines.length; i<len; i++) { 
     if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { 
      callstack.push(lines[i]); 
     } 
     } 
     //Remove call to printStackTrace() 
     callstack.shift(); 
     isCallstackPopulated = true; 
    } 
    else if (window.opera && e.message) { //Opera 
     var lines = e.message.split('\n'); 
     for (var i=0, len=lines.length; i<len; i++) { 
     if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { 
      var entry = lines[i]; 
      //Append next line also since it has the file info 
      if (lines[i+1]) { 
      entry += " at " + lines[i+1]; 
      i++; 
      } 
      callstack.push(entry); 
     } 
     } 
     //Remove call to printStackTrace() 
     callstack.shift(); 
     isCallstackPopulated = true; 
    } 
    } 
    if (!isCallstackPopulated) { //IE and Safari 
    var currentFunction = arguments.callee.caller; 
    while (currentFunction) { 
     var fn = currentFunction.toString(); 
     var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf('')) || 'anonymous'; 
     callstack.push(fname); 
     currentFunction = currentFunction.caller; 
    } 
    } 
    output(callstack); 
} 

function output(arr) { 
    // Output however you want 
    alert(arr.join('\n\n')); 
} 
+1

Cabe señalar que ahora tienen un sitio github, https://github.com/eriwen/javascript-stacktrace –

+0

Gracias James, eso es increíble. Actualizaré la respuesta –

0

DynaTrace AJAX tiene algunas de esas características. No es exactamente lo que está buscando, pero le proporciona los eventos y funciones vinculados a un elemento y le ayuda a resolver problemas. Tenía una descarga gratuita, compruébalo.

2

Puede ver el rastro de la pila de cualquier error con la llamada a la función stack() (en Firefox). La creación de una simple función para imprimir un seguimiento de la pila podría tener este aspecto:

function getStackTrace() { 
    try { 
    unusedVariable++; // This creates an error we can trace 
    } 
    catch (e) { 
    return e.stack; 
    } 
} 

Otros navegadores tienen diferentes maneras de imprimir el seguimiento de la pila, pero esto debe recibir todo lo que necesita para Firefox.

Espero que esto ayude.

+0

Eso debería ser e.stack al menos en Firefox 3.6.6 –

+0

Correcto.Demasiado pitón en el cerebro :-) (Corregido ahora) – godswearhats

0

Si simplemente desea depurar su código, su mejor opción es conseguir un plug-in de depurador para su navegador. El complemento Firebug proporciona rastros de pila. (see here)

Si desea hacerlo desde dentro de su código, no hay una característica de lenguaje estándar de JavaScript que le permita hacer esto. Los diferentes navegadores pueden implementar extensiones no estándar, pero no debe confiar en ellas.

0

Como se menciona "Casablanca" ... tenga en cuenta desde el sitio de la citada js-stack-trace ( http://www.eriwen.com/javascript/js-stack-trace/) que en Firefox y Chrome:

manera fácil obvia: Firebug, Chrome Dev Herramientas, Libélula, etc.

Puede obtener fácilmente un seguimiento de pila en cualquier momento llamando al console.trace() en su Javascript o en la consola de Firebug.

0

Dado que parece que usted quiere inspeccionar la pila y tomar elementos de la información (los nombres de función), suena como que necesita

que fue construido exactamente de ese propósito

Cuestiones relacionadas