2010-07-19 2 views
9

На любом языке программирования я могу отслеживать любую функцию и знать, какая функция вызывается другой. Но в Javascript я не знаю, как, начиная с код не написан мной и Firebug не дает этой функции - насколько я знаю.Как отслеживать события Javascript (Stack Trace)?

Пример:

Я хочу, чтобы отобразить названия функций каждой функции, которая вызывается при нажатии на XYZ элемент, и отображать их в порядке.

Спасибо.

ответ

10

Нашел: A javascript stacktrace in any browser, James говорит, что они имеют 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

Следует отметить, что теперь у них есть сайт github, https://github.com/eriwen/javascript-stacktrace –

+0

Спасибо, Джеймс, это потрясающе. Я обновлю ответ –

0

DynaTrace AJAX имеет некоторые особенности. Не совсем то, что вы ищете, но дает вам события и функции, связанные с элементом, и помогает устранить неполадки. Если бы скачать бесплатно, проверьте его.

2

Вы можете увидеть трассировку стека любой ошибки с помощью вызова функции stack() (в Firefox). Создание простой функции для вывода на печать трассировки стека может выглядеть следующим образом:

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

Другие браузеры имеют различные способы печати трассировки стека, но это должно вам то, что вам нужно для Firefox.

Надеюсь, это поможет.

+0

Это должно быть e.stack хотя бы на Firefox 3.6.6 –

+0

Исправить.Слишком много python на мозге :-) (Исправлено) – godswearhats

0

Если вы просто хотите отлаживать код, ваш лучший вариант, чтобы получить отладчик плагин для вашего браузера. Плагин Firebug обеспечивает трассировку стека. (see here)

Если вы хотите сделать это из своего кода, в JavaScript нет стандартной языковой функции, которая позволяет вам это делать. Различные браузеры могут реализовать нестандартные расширения, но вы не должны полагаться на них.

0

В "Casablanca" упоминает ... Пожалуйста, обратите внимание, с сайта вышеупомянутой JS-стек-следа ( http://www.eriwen.com/javascript/js-stack-trace/), что в FireFox и Chrome:

Очевидные легкий путь: Firebug, Chrome Dev Инструменты, Dragonfly и т. Д.

Вы можете легко получить трассировку стека в любое время, вызвав console.trace() в вашем Javascript или в консоли Firebug.

0

Поскольку это звучит, как вы хотите, чтобы проверить стек и взять куски информации (имена функций), звучит, как вам нужно

, который был построен именно для это цель.