如何跟踪Javascript事件(堆栈跟踪)?

时间:2010-07-19 17:48:20

标签: javascript javascript-events

在任何编程语言中,我都可以跟踪任何函数并知道其他函数调用了哪个函数。但是在Javascript中,我不知道如何,因为代码不是由我编写的而且Firebug没有提供此功能 - 据我所知。

示例:

我想显示单击XYZ元素时调用的每个函数的函数名称,并按顺序显示它们。

感谢。

6 个答案:

答案 0 :(得分:10)

发现这一点:A javascript stacktrace in any browserJames表示他们有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 :(得分:2)

您可以通过stack()函数调用(在Firefox上)查看任何错误的堆栈跟踪。创建一个简单的函数来打印堆栈跟踪可能如下所示:

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

其他浏览器有不同的打印堆栈跟踪的方法,但这可以为您提供Firefox所需的功能。

希望这有帮助。

答案 2 :(得分:0)

DynaTrace AJAX有一些类似的功能。不完全是您正在寻找的,但为您提供元素上绑定的事件和功能,并帮助您进行故障排除。有免费下载,请检查。

答案 3 :(得分:0)

如果您只是想调试代码,最好的选择是为您的浏览器获取调试器插件。 Firebug插件确实提供了堆栈跟踪。 (see here

如果您想在代码中执行此操作,则没有JavaScript的标准语言功能允许您执行此操作。不同的浏览器可以实现非标准扩展,但您不应该依赖它们。

答案 4 :(得分:0)

正如“卡萨布兰卡”所提到的......请注意上述js-stack-trace的网站( http://www.eriwen.com/javascript/js-stack-trace/)在FireFox和Chrome中:

  

显而易见的简单方法:Firebug,Chrome开发工具,Dragonfly等

     

您可以随时通过致电轻松获取堆栈跟踪   您的Javascript或Firebug控制台中的console.trace()。

答案 5 :(得分:0)

因为听起来你想要检查堆栈并获取信息(函数名称),听起来像你需要的

完全是为了这个目的而建造的。