2011-12-30 1 views
0

어딘가에 수천 줄의 자바 스크립트에서 ajax 호출이 수행되고 있습니다. 나는 그것이 나올 곳을 알아낼 수 없다. 그것은 페이지가로드 된 직후에 발생하는 것으로 보입니다.AJAX 요청이 모든 페이지에서 서버에 도착하고 원본 AJAX 호출의 소스를 찾을 수 없습니다.

나는 방화범이 끌려서 아약스 전화가 걸려왔다. ajax 호출은 항상 현재 페이지를 요청합니다. 따라서 예를 들어 users#new이로드되면 users#new.js을 묻는 동시에 다른 모든 컨트롤러 및 동작에서도 마찬가지입니다.

어디에서 코드를 호출했는지 확인할 수있는 방법이 있습니까?

+0

은 당신이 오해 생각하는 모든 페이지/액션 – iwasrobbed

+0

을 호출되고 무엇을 컨트롤러 행동에 기반을 분리합니다. 파이어 버그에서 아약스 전화를하는 걸 볼 수 있다고 했지? 따라서 어떤 Ajax 호출에서 어떤 경로가 요청되어 있는지 확인하면 해당 Ajax 호출이 특정 컨트롤러/동작으로 격리됩니다. 예를 들어, AJAX 호출이 서버 로그의'/ users/new' 경로에 도달하면'users # new' 액션과 관련이있을 것입니다. 그렇게하면 어떤 JS 코드가 그 호출을 할 수 있는지를 분리 할 수있게된다. –

+1

에서 발생 – iwasrobbed

답변

0

어느 시점에서 나는 내 아약스 설치 기능을 다시 작성했습니다.

$ 아약스를! = 분명히 $ .ajaxSetup :)

1

이미 해결책을 발견했습니다 있지만, 여전히 디버거를 사용하여 상황을 개선 할 수있다. jQuery와 AJAX 도우미를 사용한다고 가정하면 $.ajax 메서드의 first line에 중단 점을 설정하기 만하면됩니다.

$.ajax으로 전화를 걸면 런타임이 중단 점에서 중단되고 호출 스택을보고 호출의 출처를 정확히 알 수 있습니다.

jQuery 또는 다른 래퍼 대신 직접 XMLHttpRequest 생성자를 사용하는 경우 호출자를 추적하기 위해 원래 구현 인 XMLHttpRequest을 더미 구현으로 바꿉니다.

function XMLHttpRequest() { 
    this.open = function() {}; // ignore 
    this.send = function() { 
     debugger; 
    }; 
} 

장소 중단 점 또는이 오버라이드 (override) 구현의 전송 방법에서 프로그래밍 방식 디버거를 호출하고 누군가가 새로운 XMLHttpRequest 객체를 인스턴스화하고 send 메소드를 호출하려고 할 때마다, 당신은 전화를 차단하고 통화를 볼 수 있습니다 누가 전화를했는지 알아 내기 위해 추적합니다.

Firefox 용 Firebug 또는 Chrome 및 Safari에 내장 된 개발자 도구와 같은 우수한 디버깅 옵션이 많이 있습니다.

2

JavaScript 콘솔에서 자신의 구현으로 XMLHttpRequest.send()을 무시하고 거기에 중단 점을 설정하여 디버거가 호출되었을 때 디버거에서 스택 추적을 검사 할 수 있습니다.

var send = XMLHttpRequest.prototype.send; 
XMLHttpRequest.prototype.send = function() { 
    send.apply(this, arguments); // set break point here 
}; 
관련 문제