2010-07-19 6 views
9

어떤 프로그래밍 언어에서든, 나는 어떤 함수를 추적 할 수 있고 어떤 함수가 다른 함수에 의해 호출되는지 알 수있다. 하지만 자바 스크립트에서, 나는 코드가 내게이 아니고 방화 광이이 기능을 제공하지 않기 때문에 - 내가 아는 한, 어떻게 알지 못한다.자바 스크립트 이벤트를 추적하는 방법 (스택 추적)?

예 : 나는 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

고맙습니다. James, 정말 고맙습니다. 답변을 업데이트하겠습니다. –

0

DynaTrace AJAX에는 이와 같은 기능이 있습니다. 정확하게 당신이 찾고있는 것은 아니지만 요소에 묶인 이벤트와 함수를 제공하고 문제 해결에 도움이됩니다. 무료 다운로드가 있었는지 확인하십시오.

2

stack() 함수 호출 (Firefox의 경우)에서 스택 추적을 확인할 수 있습니다.

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

다른 브라우저는 스택 추적을 인쇄의 다른 방법을 가지고 있지만, 이것은 당신이 파이어 폭스에 필요한 무엇을 얻어야한다 : 간단한 함수를 작성하면 스택 추적은 다음과 같이 볼 수 있었다 인쇄합니다.

희망이 도움이됩니다. 이 발견

+0

적어도 Firefox 3.6.6에서는 e.stack이어야합니다. –

+0

수정하십시오.두뇌에 너무 많은 파이썬이 있습니다 :-) (지금 고정) – godswearhats

0

을 말한다, 당신의 최선의 선택은 당신의 브라우저 디버거 플러그인을 얻는 것입니다. Firebug 플러그인은 스택 추적을 제공합니다. (see here)

코드 내에서 수행하려는 경우이를 수행 할 수있는 JavaScript의 표준 언어 기능이 없습니다. 다른 브라우저 은 비표준 확장을 구현할 수 있지만 의존하지 않아야합니다.

0

"카사 블랑카"는 언급으로 ... 상기 JS-스택 트레이스 ( http://www.eriwen.com/javascript/js-stack-trace/)의 사이트에서 유의하시기 바랍니다 파이어 폭스와 크롬에서 그 :

명백한 쉬운 방법 : 방화범, 크롬 데브 도구, 잠자리 등

자바 스크립트 나 Firebug 콘솔에서 console.trace()를 호출하면 언제든지 쉽게 스택 추적을 얻을 수 있습니다.

0

당신은 스택을 검사하고 정보 (함수 이름)의 조각을 먹고 싶어처럼 소리 때문에, 당신이 필요로하는 같은 소리에 대해 정확히 지어진

그 목적.

관련 문제