Làm cách nào để gỡ lỗi JavaScript được tải động (với jQuery) trong chính trình gỡ lỗi của trình duyệt?


92

Tập lệnh được thêm động không hiển thị trong phần tập lệnh của trình gỡ lỗi của trình duyệt.

Giải trình:

Tôi cần sử dụng và đã sử dụng

if( someCondition == true ){
   $.getScript("myScirpt.js", function() {
       alert('Load Complete');
       myFunction();
   });
}

để myScript.js có thể được tải động khi đáp ứng một số điều kiện ... Và myFunction chỉ có thể được gọi sau khi tải toàn bộ tập lệnh ...

Nhưng các trình duyệt không hiển thị myScript.js được tải động trong phần tập lệnh của trình gỡ lỗi.

Có cách nào khác để có thể đạt được tất cả các mục tiêu sẽ khiến người ta có thể gỡ lỗi một tập lệnh được tải động ở đó trong chính trình duyệt không?



2
sử dụng debugger;để tự động dừng lại trong kịch bản động nạp, xem javascript.info/debugging-chrome
Yu Yang Jian

Câu trả lời:


208

Bạn có thể đặt tên cho tập lệnh được tải động của mình để nó hiển thị trong trình gỡ lỗi JavaScript của Chrome / Firefox. Để làm điều này, bạn đặt một nhận xét ở cuối tập lệnh:

//# sourceURL=filename.js

Sau đó, tệp này sẽ hiển thị trong tab "Nguồn" dưới dạng filename.js. Theo kinh nghiệm của tôi, bạn có thể sử dụng \ 's trong tên nhưng tôi nhận được hành vi kỳ lạ nếu sử dụng /' s.

Để biết thêm thông tin, hãy xem: Các điểm ngắt trong JavaScript động không còn dùng nữa của // @ sourceurl


19
Lưu ý rằng nó được thay đổi thành // #, mặc dù // @ vẫn hoạt động trong Chrome. Các tập lệnh trong tệp .html cũng có thể được đặt tên theo cách tương tự. Hãy cẩn thận! Không để trống trước và sau dấu '='.
Mert Mertce

11
Đối với tôi, tệp js đang được hiển thị trong danh sách nguồn trong một nhóm có tên "(không có miền)". Có thể đáng nói vì tôi đã bỏ lỡ nó lúc đầu!
JMac

7
Chỉ là một mẹo. Trình gỡ lỗi Chrome ném các tệp javascript giả này vào phần tử nút "(không có miền)" trong tab Nguồn, ít nhất là khi gỡ lỗi trên máy chủ cục bộ. Đó là nơi tôi tìm thấy chúng.
Robert Oschler

1
Một điều cần cảnh giác nữa là phong cách bình luận. Liên kết "ngừng sử dụng / / @ sourceURL" mà bạn đã cung cấp đề cập đến cả "// # sourceURL =" và "/ * # sourceURL =". Đó là bởi vì điều này cũng có thể được sử dụng cho CSS, nơi bạn phải sử dụng các nhận xét khối, vì các nhận xét "//" một dòng không hợp lệ. Điều làm tôi ngạc nhiên là bạn không thể sử dụng "/ * sourceURL =" trong javascript. Nó chỉ bị bỏ qua.
Jools

2
Afaik, hầu hết các trình thu nhỏ JavaScript đều loại bỏ các dòng này khỏi các giai đoạn sản xuất, khiến việc chẩn đoán lỗi sản xuất trở nên vô dụng.
Lluís Suñol

16

Bạn có thể sử dụng //# sourceURL=//# sourceMappingURL=ở cuối tệp tập lệnh hoặc thẻ tập lệnh của mình.

LƯU Ý: //@ sourceURL//@ sourceMappingURLkhông được dùng nữa.


Xem thêm thông tin không chấp nhận: developers.google.com/web/updates/2013/06/...
Pysis

Chắc chắn, nhưng hầu hết các nhà sản xuất mini sẽ loại bỏ các đường này trên các công đoạn sản xuất.
Lluís Suñol

13

Tôi đã thử sử dụng "// # sourceURL = filename.js" được OP đề xuất như một giải pháp thay thế, nhưng nó vẫn không hiển thị cho tôi trong bảng Nguồn trừ khi nó đã tồn tại trong các tab của tôi từ trước đó khi nó tạo ra một ngoại lệ.

Mã hóa một "trình gỡ lỗi;" dòng buộc nó bị đứt tại vị trí đó. Sau đó, khi nó nằm trong các tab của tôi trong bảng điều khiển Nguồn, tôi có thể đặt các điểm ngắt như bình thường và xóa "trình gỡ lỗi;" hàng.


6
Nó cũng có thể hiển thị trong danh sách (không có tên miền) trong tab Nguồn.
Splaktar

1
Tôi cũng cần sử dụng debugger;và DevTools phải mở trong khi tải tập lệnh.
Barmar

2
một chút thông tin bổ sung: sử dụng browsertools: // làm giao thức như trong //# sourceURL=browsertools://yourdomaingoeshere.com/action-openuwws.js
dolbysurnd

6

Lưu ý rằng tệp nguồn xuất hiện trong tab nguồn theo cách này sẽ xuất hiện trong nhóm (không có miền) và trong trường hợp bạn muốn gỡ lỗi, bạn sẽ cần thêm một debugger;dòng trong mã của mình, làm cho dòng đó được thực thi (thường là tại bắt đầu quá trình thực thi tệp nguồn của bạn) và sau đó thêm các điểm ngắt vào bất kỳ nơi nào bạn muốn.

Trong trường hợp bạn đang gỡ lỗi các giai đoạn sản xuất, nơi bạn có thể sẽ không có debugger;dòng nào trong mã của mình, bạn có thể thực hiện điều này bằng cách thực hiện bản đồ cục bộ với CharlesProxy tới "bản sao mới của tệp nguồn có chèn dòng trình gỡ lỗi".


2
Điều này đã cứu tôi! Bất kể tôi đã làm gì, tệp vẫn không hiển thị cho đến khi tôi đưa vào lệnh gỡ lỗi. Sau đó, nó vẫn tồn tại qua các lần tải lại trang và các phiên gỡ lỗi ngay cả khi tôi đã xóa lệnh gỡ lỗi.
Mike Devenney

0

Khi cố gắng theo dõi loại thứ này trong IE, tôi mở công cụ dành cho nhà phát triển (F12) và sau đó tìm vị trí đặt điểm ngắt bằng cách sử dụng dòng sau trong bảng điều khiển:

debugger;myFunction();

Điều đó chuyển sang tab trình gỡ lỗi, nơi bạn có thể bước vào myFunction()và đặt điểm ngắt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.