Как отследить события Javascript (Stack Trace)? - PullRequest
9 голосов
/ 19 июля 2010

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

Пример:

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

Спасибо.

Ответы [ 6 ]

10 голосов
/ 19 июля 2010

Нашел это: Трассировка стека javascript в любом браузере , Джеймс говорит, что у них теперь есть учетная запись github

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'));
}
2 голосов
/ 19 июля 2010

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

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

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

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

0 голосов
/ 28 августа 2014

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

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

0 голосов
/ 27 июня 2013

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

Очевидный простой способ: Firebug, Chrome Dev Tools, Dragonfly и т. Д.

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

0 голосов
/ 19 июля 2010

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

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

0 голосов
/ 19 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...