2012-04-09 27 views
8

Tôi đang cố gỡ lỗi một ứng dụng Intranet IE rất phức tạp. Tôi nhận được cảnh báo với thông báo tùy chỉnh cho biết rằng một ngoại lệ đã xảy ra. Tôi muốn tìm hiểu thêm thông tin về ngoại lệ này vì thông điệp không hữu ích lắm.Cách phát hiện cảnh báo JavaScript đến từ đâu?

Có trang chính chứa rất nhiều iFrames (và tệp .htc nếu điều đó tạo nên sự khác biệt) vì vậy tôi không nghĩ rằng tôi có thể thử và hijack window.alert. Khu nghỉ mát cuối cùng của tôi sẽ được thử vận ​​may của tôi với một tìm kiếm tập tin.

Sử dụng IE 8, có anyway tôi có thể phát hiện cảnh báo này đến từ đâu không? Giải pháp lý tưởng sẽ bằng cách nào đó tạo ra một hàm "breakOnAlert" để chèn một câu lệnh debbuger vào đúng vị trí cảnh báo.

Để làm rõ: Trang chính chứa nhiều khung nội tuyến và tôi tin rằng lỗi + cảnh báo đến từ một trong các tùy chọn này. Mỗi khung nội tuyến là một trang aspx (đôi khi với html/javascript động từ người dùng) và chứa JavaScript nội tuyến và bên ngoài. Trước khi đăng, tôi đã cố gắng ghi đè cảnh báo trong trang của tôi (trang con trong iframe) nhưng nó không hoạt động. Tôi giả định rằng Nó không hoạt động vì mỗi khung nội tuyến có đối tượng cửa sổ riêng của chúng, vì vậy mỗi khung nội tuyến có phiên bản cảnh báo riêng của mình. Để làm việc này, tôi sẽ cần phải tìm tất cả các iframe và ghi đè lên nó cho mỗi cái, cái gì đó mà tôi nghĩ sẽ rất phức tạp để làm. Trong các công cụ phát triển IE, tôi có thể thấy một số lượng lớn các tệp kịch bản (nội tuyến và bên ngoài), vì vậy sẽ rất khó để tìm kiếm các cảnh báo trong đó theo cách thủ công.

+0

tắt chủ đề, nhưng xin vui lòng gửi mã để thedailywtf.com –

Trả lời

5

Kể từ đó là một việc vặt thực để làm điều đó trong tất cả các iframe, tôi muốn có thể sử dụng Fiddler và programatically thay alert( với một cái gì đó như:

(function(n){alert(n);debugger;})(

IE nên hỗ trợ tuyên bố debugger, vì vậy bạn muốn có một cuộc gọi-stack

This page giải thích làm thế nào để làm một văn bản thay thế trong Fiddler

Ví dụ Fiddler quy tắc tùy chỉnh để thêm vào OnBeforeResponse:

if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")) 
{ 
    oSession.utilDecodeResponse(); 
    var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes); 
    oBody = oBody.replace(/alert\(/gi, "(function(n){alert(n);debugger;})("); 
    oSession.utilSetResponseBody(oBody); 
} 
+0

Giải pháp tuyệt vời. Tôi đã cập nhật câu trả lời của bạn (đang chờ phê duyệt) với quy tắc Fiddler đang hoạt động. Cảm ơn. – row1

1

Ovveride chức năng cảnh báo và thiết lập một breakpoint bên trong, sau đó bạn có thể xem Stack Trace :)

function alert(message) { 
    var x = 'whatever'; 
} 


$(function() { 
    alert('test'); 
}); 
+1

Hi, như đã nói tôi don Không nghĩ rằng điều này sẽ làm việc do tất cả các iFrames. Tôi đã thử trước khi đăng câu hỏi, nhưng tôi đoán rằng nó không hoạt động bởi vì mỗi khung sẽ có window.alert của riêng mình() Tôi sẽ cần phải ghi đè lên tất cả. – row1

+0

Sau đó, cảm ơn bạn vì thông tin này :) Tôi không biết điều đó. –

Các vấn đề liên quan