Có thể gỡ lỗi JavaScript tải động bằng một số trình gỡ lỗi như WebKit, FireBug hoặc IE8 Developer Tool không?


90

Từ câu hỏi gần đây của tôi , tôi đã tạo một số hàm JavaScript cho chế độ xem một phần tải động. Vì vậy, tôi không thể gỡ lỗi bất kỳ JavaScript tải động nào. Bởi vì tất cả JavaScript được tải sẽ được đánh giá bằng hàm "eval".

Tuy nhiên, tôi đã tìm thấy một số cách để tạo JavaScript mới bằng cách sử dụng tập lệnh sau để tạo động tập lệnh vào tiêu đề của tài liệu hiện tại. Tất cả các tập lệnh đã tải sẽ được hiển thị trong HTML DOM (bạn có thể sử dụng bất kỳ trình gỡ lỗi nào để tìm nó).

var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.text = "alert('Test!');";

document.getElementsByTagName('head')[0].appendChild(script);

Nhân tiện, hầu hết trình gỡ lỗi (Thanh công cụ dành cho nhà phát triển IE8, Firebug và Google Chrome) không thể đặt breakpoint trong bất kỳ tập lệnh động nào. Bởi vì tập lệnh có thể gỡ lỗi phải được tải vào lần đầu tiên sau khi trang được tải.

Bạn có ý tưởng gỡ lỗi trong tệp hoặc nội dung tập lệnh động không?

Cập nhật 1 - Thêm mã nguồn để thử nghiệm

Bạn có thể sử dụng tệp xhtml sau để cố gắng gỡ lỗi một số giá trịVariable.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>    
    <title>Dynamic Loading Script Testing</title>
    <script type="text/javascript">
    function page_load()
    {       
        var script = document.createElement('script')
        script.setAttribute("id", "dynamicLoadingScript");
        script.setAttribute("type","text/javascript");
        script.text =   "var someVariable = 0;\n" +
                        "someVariable = window.outerWidth;\n" +
                        "alert(someVariable);";

        document.getElementsByTagName('head')[0].appendChild(script);
    }
    </script>
</head>
<body onload="page_load();">
</body>
</html>

Từ câu trả lời, tôi chỉ kiểm tra nó trong FireBug. Kết quả sẽ được hiển thị như hình ảnh dưới đây.

văn bản thay thế http://d7cgnq.bay.livefilestore.com/y1pJGV27qEARXzZhsMMhPD5z0OxAtnkQK8eKeEXMAxuHjsuWeAq1aGl7sTISRNqVv3lw8ghyxE_GorlwSJDvTql0m0ug-NGableSJDvTql0m0ug

Vui lòng xem tập lệnh "dynamicLoadingScript" được thêm vào sau khi tải trang.

văn bản thay thế http://d7cgnq.bay.livefilestore.com/y1pz_RwqjgeVqe2mAlUZha0PalpPdP0X5AiwJcQhYahERlnbPDdZpb-_d1e96Q-14raSDMJOBsdcV9jsi4B5yCUDh0scriptk

Nhưng nó không được tìm thấy trong tab script của FireBug

Cập nhật 2 - Tạo điểm ngắt gỡ lỗi trong tập lệnh tải động

văn bản thay thế http://d7cgnq.bay.livefilestore.com/y1peKdIMOztXss-pc8PlJEmaGov_0ShYnLsuDdK5OLETbCG0UpkX6Te29w0YW2pNKaD_0ANAiizh2GdGPAAp_14Q0JWAET

văn bản thay thế http://d7cgnq.bay.livefilestore.com/y1pUeHaHoTXj0WBl74fnTrXwdr_y7s7h8jNKfslSONgshzZBpUddGHNBWA9cXRabo3HAl3QazeozrCABo7pNVQc1Acl-UromeXXbHgger

Cả hai hình ảnh trên đều hiển thị chèn "debugger;" trong một số dòng tập lệnh có thể kích hoạt điểm ngắt trong tập lệnh tải động. Tuy nhiên, cả hai trình gỡ lỗi đều không hiển thị bất kỳ mã nào tại điểm ngắt. Vì vậy, nó là vô ích cho việc làm này.

Cảm ơn,


Bạn đã tình cờ tìm thấy một giải pháp cho điều này? Tôi ở đây với cùng một vấn đề.
adamJLev

Hãy thử tải động một tệp riêng biệt, tức là xem tại đây để biết truy vấn triển khaij.com/2011/03/11/a-lightweight-script-loader - Tôi thấy trình gỡ lỗi xử lý điều đó dễ dàng hơn nhiều.
James Westgate

@infinity, hãy kiểm tra giải pháp của tôi
Molecular Man

3
2014 và hình ảnh của bạn vẫn chưa chết - Bạn có thể reup chúng không?
TheGeekZn

Tôi có một câu hỏi tương tự nhưng tôi không thể nói vì hình ảnh bị hỏng. Bạn có thể cập nhật chúng không?
Eric

Câu trả lời:


117

Nó cũng có thể sử dụng chrome cho tương tự. Chrome có một tính năng trong đó bạn có thể chỉ định thuộc tính phân tích cú pháp và làm cho phần JS động xuất hiện dưới dạng tệp sau đó có thể được duyệt và đặt điểm ngắt.

thuộc tính cần được đặt là

//# sourceURL=dynamicScript.js

trong đó dynamicScript.js là tên của tệp sẽ hiển thị trong trình duyệt tệp tập lệnh.

Thông tin thêm tại đây

Paul Ailen cũng nói ngắn gọn về nó trong bài nói chuyện tuyệt vời của anh ấy trên Tooling & The Webapp Development Stack


5
Trong trường hợp ai đó đang gặp sự cố với MVC3 / Razor, hãy nhớ thoát khỏi biểu tượng @, vì vậy một cái gì đó giống như // @@ sourceURL = dynamiccript.js Và chỉ fyi, ở trên cũng hoạt động với firebug.
parsh

1
Bạn cũng có thể sử dụng tính năng này cho javascrip nội tuyến động. Tuy nhiên, nếu bạn có một số ngoại lệ trong tập lệnh đó, bạn sẽ không thấy nó trong danh sách nguồn.
Roman Snitko

4
Lưu ý rằng cú pháp mới là "// # sourceURL = dynamicScript.js" thay đổi từ @ thành #
Cekk

3
liên kết được cập nhật vào phần công cụ phát triển chrome trên nguồn bản đồ là - developer.chrome.com/devtools/docs/...
chrismarx

3
Đố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

21

Hãy thử thêm một "trình gỡ lỗi;" trong javascript mà bạn đang thêm động. Điều này sẽ khiến nó dừng lại ở dòng đó bất kể cài đặt điểm ngắt.


Tất cả những gì tôi có thể tìm thấy là: code.google.com/p/fbug/issues/detail?id=1259 . Nhân tiện, tôi sử dụng thẻ script gắn vào head để tải động các tập lệnh (nhưng sử dụng thuộc tính src) và mã được thêm theo cách này có thể gỡ lỗi cho tôi trên tất cả các trình duyệt, ngay cả khi nó không được tải cùng với trang đầu tiên.
Joeri Sebrechts

Mã chính xác bạn đang sử dụng để thêm thẻ script là gì? Tôi đang gặp sự cố tương tự với OP, khiến không thể gỡ lỗi các tệp JS được tải động trong Chrome. Cám ơn!
adamJLev

var loaderNode = document.createElement ("script"); loaderNode.setAttribute ("type", "text / javascript"); loaderNode.setAttribute ("src", url); document.getElementsByTagName ("head") [0] .appendChild (loaderNode);
Joeri Sebrechts

18

Có, Có thể (bây giờ) gỡ lỗi JavaScript được tải động bằng Google Chrome!

Không cần thêm debugger;thuộc tính bổ sung hoặc bất kỳ thuộc tính nào khác cho tệp JS được tải động. Chỉ cần làm theo các bước dưới đây để gỡ lỗi:

Phương pháp 1:

Trưởng nhóm công nghệ của tôi vừa chỉ ra một cách siêu dễ dàng để gỡ lỗi các phương thức Javascript được tải động.

  1. Mở Console của chrome và viết tên của phương thức và nhấn enter.
    Trong trường hợp của tôi, đó là GetAdvancedSearchConditonRowNew
    Nếu phương thức JS đã được tải thì nó sẽ hiển thị định nghĩa của phương thức.

nhập mô tả hình ảnh ở đây


  1. Nhấp vào định nghĩa của phương thức và toàn bộ tệp JS sẽ được mở để gỡ lỗi :)

nhập mô tả hình ảnh ở đây


Phương pháp 2:

Ví dụ: tôi đang tải tệp JS khi tôi nhấp vào nút bằng ajaxlệnh gọi.

  1. Mở networktab trong google chrome dev tools
  2. Nhấp vào một điều khiển (ví dụ: nút) tải một số tệp javascript và gọi một số hàm javascript.
  3. quan sát tab mạng và tìm kiếm hàm JS đó (trong trường hợp của tôi là như vậy RetrieveAllTags?_=1451974716935)
  4. Di chuột qua nó initiatervà bạn sẽ tìm thấy tệp JS được tải động của mình (có tiền tố VM*).

gỡ lỗi JavaScript tải động trong chrome -1


  1. Bấm vào VM*tệp đó để mở.
  2. Đặt trình gỡ lỗi bất cứ nơi nào bạn muốn trong tệp đó: D

gỡ lỗi JavaScript tải động trong chrome -1



Thật xấu hổ cho Google vì đã làm cho điều này trở nên tồi tệ. 1 / Shame = Kudos (nghịch đảo của sự xấu hổ) cho bạn để kéo nó ra :)
toddmo

16

Tôi đang sử dụng google chrome cho mục đích đó.

Trong chrome tại tab script, bạn có thể bật 'tạm dừng trên tất cả các ngoại lệ'

nhập mô tả hình ảnh ở đây

Và sau đó đặt ở đâu đó trong dòng mã của bạn try{throw ''} catch(e){} . Chrome sẽ ngừng thực thi khi đạt đến dòng này.

EDIT: hình ảnh đã được sửa đổi để rõ ràng hơn những gì tôi đang nói đến.


Để phát triển trong Google Chrome, bạn nên chèn một số văn bản cho biết tên của tập lệnh động hiện tại khi jQuery hoặc bất kỳ tập lệnh tải nào khác nối tập lệnh vào DOM như tôi đã báo cáo với nhóm jQuery. Nhưng tôi không có thời gian để làm việc đó. bugs.jquery.com/ticket/8292
Soul_Master

@Soul_Master, nhưng sử dụng phương pháp của tôi, bạn không cần phải chèn văn bản. Bạn chèn vào dòng tập lệnh động của mình, try{throw ''} catch(e){}sau đó bật chế độ 'tạm dừng trên tất cả các trường hợp ngoại lệ' và chrome sẽ ngừng thực thi khi xuất hiện exeption. Tôi đã kiểm tra nó nhiều lần. Tôi đã tải một hình ảnh khác. Nó rõ ràng hơn ở đó những gì tôi đang nói về.
Molecular Man,

Trong chrome, bạn có thể sử dụng câu lệnh "debugger;" để ngắt câu lệnh khi mở bảng điều khiển trình gỡ lỗi. Chrome sẽ đơn giản bỏ qua điều này nếu bảng gỡ lỗi bị đóng.
dinesh ygv

@dineshygv, bạn có thể ... bây giờ. Nhưng bạn không thể 3 năm trước. debuggersẽ không hoạt động trong tập lệnh được tạo động trước đó.
Molecular Man

10

Tôi nghĩ bạn có thể cần đặt "tên" cho mã eval'd như sau:

http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

Nếu bạn làm vậy, tôi nghĩ có khả năng debuggercách tiếp cận từ "bản cập nhật 2" sẽ hoạt động sau đó.


Đúng. Tôi thấy nó. Tôi đã báo cáo lỗi này cho nhóm jQuery trong một thời gian dài. bug.jquery.com/ticket/8292
Soul_Master

1
Cảnh báo! kỹ thuật được mô tả gây ra lỗi trong IE7, vì vậy đừng để nguyên bản //@ sourceURL=blahsản xuất.
Jethro Larson

nó có thể là debuggermột phần gây ra vấn đề, không phải nhận xét nguồn (chắc chắn bị JS bỏ qua)
Kyle Simpson

Nó có thể gây ra vấn đề với biên dịch có điều kiện. ví dụ: javascriptkit.com/javatutors/conditionalcompile.shtml
Jethro Larson

5

CẬP NHẬT : cú pháp cho sourceUrl đã được thay đổi (@ được thay thế bằng #) để tránh lỗi trên các trình duyệt không được hỗ trợ (đọc: IE). Chi tiết


2

Sử dụng Chrome (12.0.742.112) với mã bạn đã cung cấp cùng với câu lệnh trình gỡ lỗi như thế này

    script.text =   "debugger;var someVariable = 0;\n" +
    "someVariable = window.outerWidth;\n" +
    "alert(someVariable);";

chrome_debugger

làm việc cho tôi.

Tôi cần sửa đổi một số JavaScript (giới hạn phạm vi của tất cả bộ chọn jQuery thành một phần> xem div hiện tại) trước khi thực thi nó.

Có thể nó hữu hình hơn nếu bạn liên kết thay đổi bộ chọn với một sự kiện trên chế độ xem một phần của bạn thay vì tạo các phần tử tập lệnh trong nội dung html (không ổn).

Bạn có thể làm điều gì đó như thế này

   (function(j)(
      var limiting_selector = '';
      j(".partial_views").bind('focusin over',function(e){
         limiting_selector = j(this).attr('someattr') // or j(this).data('limiting-selector')
      }).bind('focusout out',function(e){
         limiting_selector = '';
      });
      // And then go on with
      // j(limiting_selector+' .someclass')
   ))(jQuery)

Mã này sẽ luôn thêm một bộ chọn giới hạn cho tất cả các hoạt động chọn jQuery được thực hiện khi con chuột đang ở trong một phần tử nhất định do HTML không bị rối tung.

(Vẫn có vẻ khó khăn, có thể ai đó có giải pháp tốt hơn)

hoan hô


1

Trong Firebug, bạn sẽ có thể thấy tập lệnh đó sau khi trang được tải và tập lệnh được đưa vào. Khi làm vậy, bạn có thể đặt một điểm ngắt ở vị trí thích hợp và nó sẽ được giữ nguyên khi bạn làm mới trang.


Bạn đúng. Điều đó không hiệu quả. Tôi đã thử nó với eval () và Firebug sẽ cho phép bạn đặt điểm ngắt khi bạn sử dụng điểm đó. Có lý do gì khiến bạn không thể sử dụng eval () và cần đặt thẻ script? Thậm chí tổng quát hơn, có lý do gì khiến bạn không thể phân phát javascript động này dưới dạng tệp .js riêng biệt trên máy chủ của mình không? Bạn đang cố gắng giải quyết vấn đề gì?
Moishe Lettvin

Tôi cần sửa đổi một số JavaScript (giới hạn phạm vi của tất cả bộ chọn jQuery thành div chế độ xem một phần hiện tại) trước khi thực thi nó. Hoặc bạn có bất kỳ ý tưởng nào để giải quyết câu hỏi gần đây của tôi. Để biết thêm thông tin, vui lòng xem câu hỏi gần đây của tôi.
Soul_Master

1

Javascript được tải động vẫn phải được trình duyệt phân tích cú pháp, đây là nơi chứa trình gỡ lỗi WebKit hoặc FireBug, vì vậy nó phải chịu sự điều chỉnh của trình gỡ lỗi, tôi nghĩ điều này cũng giống với các công cụ dành cho nhà phát triển trong IE8,

Vì vậy, mã của bạn là đối tượng của trình gỡ lỗi nên nơi bạn gặp sự cố sẽ không nằm trong tệp hoặc văn bản đó nếu nó không bị lỗi

Thứ khác script.text = "alert('Test!');";không hợp lệ nên nó sẽ không hoạt động trên tất cả các trình duyệt mà bạn muốn làscript.innerHTML = "alert('Test!');";

mặc dù bên trong của nó, nó có nghĩa là mã bên trong các Thẻ HTML chứ không phải HTML bên trong chỉ sử dụng nhiều nhất mà mọi người sử dụng nó cho việc này, vì vậy nó được giải thích sai

CHỈNH SỬA ĐỂ CẬP NHẬT HAI

Và trên bản cập nhật thứ hai bằng Chrome, tôi đã làm điều này

chuyển đến about: blank Mở bảng điều khiển lên và chuyển qua

var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.innerHTML = "alert('Test!');debugger;";

document.getElementsByTagName('head')[0].appendChild(script);

sau đó nó sẽ ngắt và mở tab script với about: blank được hiển thị (không có gì để xem)

Sau đó, ở bên tay phải hiển thị danh sách ngăn xếp cuộc gọi, sau đó nhấp vào thứ hai (chức năng ẩn danh) và nó sẽ hiển thị cho bạn.

Vì vậy, trên tệp của bạn, bạn sẽ có một (chức năng ẩn danh) là mã bạn đang chạy và bạn sẽ thấy điểm ngắt trong đó. vì vậy bạn biết mình đúng.


0

Sử dụng Công cụ dành cho nhà phát triển của Google Chrome (hoặc Safari ), bạn có thể chạy JavaScript từng dòng. Tập lệnh

Công cụ dành cho nhà phát triển Chọn tập lệnh bạn muốn gỡ lỗi dấu hiệu tạm dừng ở phía bên phải Hoặc đặt các điểm ngắt bằng cách nhấp vào số dòng>>>


0

Một tùy chọn tôi muốn sử dụng là thêm câu lệnh console.log ('') trong mã của tôi. Khi câu lệnh này xuất hiện trong bảng điều khiển, một số dòng được liên kết với nó. Bạn có thể nhấp vào số đó để đi đến vị trí trong nguồn và đặt điểm ngắt. Hạn chế của cách tiếp cận này là các điểm ngắt không được bảo toàn qua các lần tải lại trang và bạn phải chạy qua mã trước khi có thể thêm trình gỡ lỗi.


0

Đối với trình duyệt Google Chrome hiện tại hoặc các trình duyệt hiện đại khác, bạn có thể dễ dàng tìm kiếm bất kỳ mã được đánh giá nào bằng công cụ dành cho nhà phát triển như hình ảnh sau.

  1. Mô phỏng một số tệp tải động.

nhập mô tả hình ảnh ở đây

  1. Nhấn Ctrl + Shift + F trong tab nguồn và tìm kiếm hàm trên.

nhập mô tả hình ảnh ở đây

Tạo một số điểm ngắt và thực thi chức năng để kiểm tra nó.

nhập mô tả hình ảnh ở đây

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.