เป็นไปได้ไหมที่จะดีบัก JavaScript ที่โหลดแบบไดนามิกโดยดีบักเกอร์เช่น WebKit, FireBug หรือ IE8 Developer Tool


90

จากคำถามล่าสุดของฉันฉันได้สร้างฟังก์ชัน JavaScript สำหรับการโหลดแบบไดนามิกบางส่วนแล้ว ดังนั้นฉันจึงไม่สามารถดีบัก JavaScript ที่โหลดแบบไดนามิกได้ เนื่องจาก JavaScript ที่โหลดทั้งหมดจะถูกประเมินโดยฟังก์ชัน "eval"

อย่างไรก็ตามฉันพบวิธีบางอย่างในการสร้าง JavaScript ใหม่โดยใช้สคริปต์ต่อไปนี้เพื่อสร้างสคริปต์ในส่วนหัวของเอกสารปัจจุบันแบบไดนามิก สคริปต์ที่โหลดทั้งหมดจะแสดงใน HTML DOM (ซึ่งคุณสามารถใช้ดีบักเกอร์ใดก็ได้เพื่อค้นหา)

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

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

อย่างไรก็ตามดีบักเกอร์ส่วนใหญ่ (แถบเครื่องมือสำหรับนักพัฒนา IE8, Firebug และ Google Chrome) ไม่สามารถตั้งค่าเบรกพอยต์ในสคริปต์ไดนามิกใด ๆ เนื่องจากต้องโหลดสคริปต์ debuggable ในครั้งแรกหลังจากโหลดเพจแล้ว

คุณมีแนวคิดในการแก้ไขข้อบกพร่องในเนื้อหาสคริปต์แบบไดนามิกหรือไฟล์หรือไม่?

อัปเดต 1 - เพิ่มซอร์สโค้ดสำหรับการทดสอบ

คุณสามารถใช้ไฟล์ xhtml ต่อไปนี้เพื่อพยายามดีบักค่า someVariable

<!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>

จากคำตอบฉันเพิ่งทดสอบใน FireBug ผลลัพธ์ควรแสดงเหมือนภาพด้านล่าง

ข้อความแสดงแทน http://d7cgnq.bay.livefilestore.com/y1pJGV27qEARXzZhsMMhPD5z0OxAtnkQK8eKeEXMAxuHjsuWeAq1aGl7sTISRNqVv3lw8ghyxE_GorlwSJDvTql0mugPug

โปรดดูสคริปต์ "dynamicLoadingScript" ที่เพิ่มเข้ามาหลังจากการโหลดหน้าเว็บ

ข้อความแสดงแทน http://d7cgnq.bay.livefilestore.com/y1pz_RwqjgeVqe2mAlUZha0PalpPdP0X5AiwJcQhYahERlnbPDdZpb-_d1e96Q-14raSDMJOBsdcV9jsi4B5yNGCUDqm41kfire

แต่ไม่พบในแท็บสคริปต์ของ FireBug

อัปเดต 2 - สร้าง Debug Breakpoint ในสคริปต์การโหลดแบบไดนามิก

ข้อความแสดงแทน http://d7cgnq.bay.livefilestore.com/y1peKdIMOztXss-pc8PlJEmaGov_0ShYnLsuDdK5OLETbCG0UpkX6Te29w0YW2pNKaD_0ANAiizh2GdGPAAp_1q0JWAETo4Q10.

ข้อความแสดงแทน http://d7cgnq.bay.livefilestore.com/y1pUeHaHoTXj0WBl74fnTrXwdr_y7s7h8jNKfslSONgshzZBpUddGHNBWA9cXRabo3HAl3QazeozrCABo7pNVQc1Acl-UXGo7pNVQc1Acl

ทั้งสองภาพด้านบนแสดงการแทรก "debugger;" คำสั่งในบางบรรทัดของสคริปต์สามารถยิงเบรกพอยต์ในสคริปต์การโหลดแบบไดนามิก อย่างไรก็ตามดีบักเกอร์ทั้งสองไม่แสดงรหัสใด ๆ ที่เบรกพอยต์ ดังนั้นจึงไม่มีประโยชน์สำหรับการทำเช่นนี้

ขอบคุณ


คุณบังเอิญพบวิธีแก้ปัญหานี้หรือไม่? ฉันอยู่ที่นี่พร้อมกับปัญหาเดียวกัน
adamJLev

ลองโหลดไฟล์แยกต่างหากแบบไดนามิกคือดูที่นี่สำหรับการดำเนินการqueryj.com/2011/03/11/a-lightweight-script-loader - ฉันพบจุดบกพร่องจัดการที่ไกลมากขึ้นได้อย่างง่ายดาย
James Westgate


3
2014 และภาพของคุณยังไม่ตาย - คุณสามารถอัปโหลดใหม่ได้หรือไม่?
TheGeekZn

ฉันมีคำถามคล้าย ๆ กัน แต่ไม่สามารถบอกได้เพราะภาพแตก คุณสามารถอัปเดตได้หรือไม่?
Eric

คำตอบ:


118

นอกจากนี้ยังเป็นไปได้ที่จะใช้โครเมี่ยมสำหรับสิ่งเดียวกัน Chrome มีคุณลักษณะที่คุณสามารถระบุแอตทริบิวต์ตัวแยกวิเคราะห์และทำให้ส่วนของไดนามิก JS ปรากฏเป็นไฟล์ซึ่งสามารถเรียกดูและกำหนดจุดพักได้

แอตทริบิวต์ที่ต้องตั้งค่าคือ

//# sourceURL=dynamicScript.js

โดยที่ dynamicScript.js เป็นชื่อของไฟล์ที่ควรปรากฏในเบราว์เซอร์ไฟล์สคริปต์

ข้อมูลเพิ่มเติมที่นี่

Paul Irish ยังพูดถึงเรื่องนี้สั้น ๆ ในการพูดคุยที่ยอดเยี่ยมของเขาเกี่ยวกับTooling & The Webapp Development Stack


5
ในกรณีที่มีคนกำลังมีปัญหากับ MVC3 / Razor อย่าลืมปิดสัญลักษณ์ @ ดังนั้นบางอย่างเช่น // @@ sourceURL = dynamicscript.js และเพียงแค่ fyi ข้างต้นก็ใช้ได้ใน firebug เช่นกัน
พาร์ช

1
คุณสามารถใช้คุณสมบัตินี้สำหรับจาวาสคริปต์อินไลน์แบบไดนามิกได้เช่นกัน แต่ถ้าคุณมีข้อยกเว้นบางอย่างในสคริปต์นั้นคุณจะไม่เห็นมันในรายการแหล่งที่มา
Roman Snitko

4
โปรดทราบว่าไวยากรณ์ใหม่คือ "// # sourceURL = dynamicScript.js" เปลี่ยนจาก @ เป็น #
Cekk

3
ลิงก์ที่อัปเดตไปยังส่วนเครื่องมือสำหรับนักพัฒนา Chrome บนแผนที่ต้นทางคือ - developer.chrome.com/devtools/docs/…
chrismarx

3
สำหรับฉันไฟล์ js กำลังแสดงในรายการแหล่งที่มาภายในกลุ่มที่เรียกว่า "(ไม่มีโดเมน)" อาจจะคุ้มที่จะพูดถึงเพราะตอนแรกพลาดไป!
JMac

21

ลองเพิ่ม "debugger;" คำสั่งในจาวาสคริปต์ที่คุณกำลังเพิ่มแบบไดนามิก สิ่งนี้ควรทำให้หยุดที่บรรทัดนั้นโดยไม่คำนึงถึงการตั้งค่าเบรกพอยต์


ทั้งหมดที่ฉันสามารถค้นหาคือ: code.google.com/p/fbug/issues/detail?id=1259 อย่างไรก็ตามฉันใช้แท็กสคริปต์ต่อท้ายส่วนหัวเพื่อโหลดสคริปต์แบบไดนามิก (แต่ใช้แอตทริบิวต์ src) และโค้ดที่เพิ่มด้วยวิธีนี้สามารถแก้ปัญหาได้สำหรับฉันในทุกเบราว์เซอร์แม้ว่าจะไม่ได้โหลดพร้อมกับหน้าเริ่มต้นก็ตาม
Joeri Sebrechts

คุณใช้โค้ดอะไรเพื่อเพิ่มแท็กสคริปต์ ฉันมีปัญหาเดียวกันกับ OP ซึ่งทำให้ไม่สามารถดีบักไฟล์ JS ที่โหลดแบบไดนามิกใน Chrome ได้ ขอบคุณ!
adamJLev

var loaderNode = document.createElement ("สคริปต์"); loaderNode.setAttribute ("type", "text / javascript"); loaderNode.setAttribute ("src", url); document.getElementsByTagName ("head") [0] .appendChild (loaderNode);
Joeri Sebrechts

18

ใช่ตอนนี้เป็นไปได้ที่จะแก้ไขข้อบกพร่อง JavaScript ที่โหลดแบบไดนามิกโดยใช้ Google Chrome!

ไม่จำเป็นต้องเพิ่มคุณสมบัติพิเศษdebugger;หรือแอตทริบิวต์อื่น ๆ สำหรับไฟล์ JS ที่โหลดแบบไดนามิก เพียงทำตามขั้นตอนด้านล่างเพื่อแก้ไขข้อบกพร่อง:

วิธีที่ 1:

หัวหน้าฝ่ายเทคโนโลยีของฉันเพิ่งแสดงวิธีที่ง่ายสุด ๆ ในการดีบักเมธอด Javascript ที่โหลดแบบไดนามิก

  1. เปิดคอนโซลของ chrome และเขียนชื่อของวิธีการและกด Enter
    ในกรณีของฉันมันคือGetAdvancedSearchConditonRowNew
    ถ้าโหลดเมธอด JS มันจะแสดงนิยามของเมธอด

ป้อนคำอธิบายภาพที่นี่


  1. คลิกที่คำจำกัดความของวิธีการและไฟล์ JS ทั้งหมดจะถูกเปิดขึ้นเพื่อแก้ไขข้อบกพร่อง :)

ป้อนคำอธิบายภาพที่นี่


วิธีที่ 2:

ตัวอย่างเช่นฉันกำลังโหลดไฟล์ JS เมื่อคลิกปุ่มโดยใช้การ ajaxโทร

  1. เปิดnetworkแท็บในเครื่องมือ dev ของ Google Chrome
  2. คลิกที่ปุ่มควบคุม (เช่นปุ่ม) ซึ่งโหลดไฟล์จาวาสคริปต์และเรียกใช้ฟังก์ชันจาวาสคริปต์
  3. สังเกตแท็บเครือข่ายและมองหาฟังก์ชัน JS นั้น (ในกรณีของฉันคือRetrieveAllTags?_=1451974716935)
  4. วางเมาส์เหนือไฟล์initiaterแล้วคุณจะพบไฟล์ JS ที่โหลดแบบไดนามิก (พร้อมคำนำหน้าVM*)

ดีบัก JavaScript การโหลดแบบไดนามิกใน chrome -1


  1. คลิกที่VM*ไฟล์นั้นเพื่อเปิด
  2. ใส่ดีบักเกอร์ทุกที่ที่คุณต้องการในไฟล์นั้น: D

ดีบัก JavaScript การโหลดแบบไดนามิกใน chrome -1



อัปยศใน Google ที่ทำสิ่งนี้ป้าน 1 / Shame = ความรุ่งโรจน์ (ผกผันของความอัปยศ) สำหรับคุณที่ดึงมันออกมา :)
Toddmo

16

ฉันใช้ Google Chrome เพื่อจุดประสงค์นั้น

ใน chrome ที่แท็บสคริปต์คุณสามารถเปิดใช้งาน "หยุดชั่วคราวในข้อยกเว้นทั้งหมด"

ป้อนคำอธิบายภาพที่นี่

try{throw ''} catch(e){}แล้วใส่ที่ใดที่หนึ่งในสายรหัสของคุณ Chrome จะหยุดการทำงานเมื่อมาถึงบรรทัดนี้

แก้ไข: แก้ไขรูปภาพเพื่อให้ชัดเจนยิ่งขึ้นว่าฉันกำลังพูดถึงอะไร


สำหรับการพัฒนาใน Google Chrome คุณควรแทรกข้อความที่ระบุชื่อของสคริปต์ไดนามิกปัจจุบันเมื่อ jQuery หรือสคริปต์การโหลดอื่น ๆ ต่อท้ายสคริปต์กับ DOM เช่นที่ฉันรายงานไปยังทีม jQuery แต่ฉันไม่มีเวลาทำงานกับมัน bugs.jquery.com/ticket/8292
Soul_Master

@Soul_Master แต่ใช้วิธีของฉันคุณไม่จำเป็นต้องแทรกข้อความ คุณแทรกบรรทัดสคริปต์แบบไดนามิกของคุณtry{throw ''} catch(e){}จากนั้นเปิดใช้งานโหมด "หยุดชั่วคราวในข้อยกเว้นทั้งหมด" และ Chrome จะหยุดการดำเนินการเมื่อมีการกำจัด ฉันตรวจสอบหลายครั้งแล้ว ฉันโหลดภาพอื่น ชัดเจนกว่าที่ฉันกำลังพูดถึง
Molecular Man

ใน Chrome คุณสามารถใช้คำสั่ง "debugger;" เพื่อทำลายคำสั่งเมื่อแผงดีบักเกอร์เปิดอยู่ Chrome จะเพิกเฉยต่อสิ่งนี้หากแผงดีบักเกอร์ปิดอยู่
dinesh ygv

@dineshygv คุณสามารถ ... ตอนนี้ แต่คุณไม่สามารถ 3 ปีที่แล้ว debuggerจะไม่ทำงานในสคริปต์ที่สร้างแบบไดนามิกในตอนนั้น
Molecular Man

10

ฉันคิดว่าคุณอาจต้องตั้งรหัส "ชื่อ" ให้กับรหัสแบบนี้:

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

ถ้าเป็นเช่นนั้นฉันคิดว่าน่าจะเป็นdebuggerแนวทางจาก "อัปเดต 2" แล้ว


ใช่. ฉันเห็นมัน. ฉันได้รายงานข้อผิดพลาดนี้กับทีม jQuery เป็นเวลานานแล้ว bugs.jquery.com/ticket/8292
Soul_Master

1
คำเตือน! เทคนิคที่อธิบายไว้ทำให้เกิดข้อผิดพลาดใน IE7 ดังนั้นอย่าทิ้งการ//@ sourceURL=blahผลิต
Jethro Larson

อาจเป็นdebuggerส่วนที่ทำให้เกิดปัญหาไม่ใช่ความคิดเห็นที่มา (ซึ่ง JS เพิกเฉยอย่างแน่นอน)
Kyle Simpson

อาจทำให้เกิดปัญหากับการคอมไพล์ตามเงื่อนไขเช่น เช่นjavascriptkit.com/javatutors/conditionalcompile.shtml
Jethro Larson


2

การใช้ Chrome (12.0.742.112) กับรหัสที่คุณให้มาบวกกับคำสั่งดีบักเกอร์เช่นนี้

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

chrome_debugger

เหมาะกับฉัน

ฉันต้องการแก้ไข JavaScript บางส่วน (จำกัด ขอบเขตของตัวเลือก jQuery ทั้งหมดเป็นบางส่วน> ดู div ในปัจจุบัน) ก่อนที่จะดำเนินการ

อาจจับต้องได้มากขึ้นถ้าคุณผูกตัวเลือกการเปลี่ยนแปลงกับเหตุการณ์ในมุมมองบางส่วนของคุณแทนที่จะสร้างองค์ประกอบสคริปต์ในเนื้อหา html (ไม่รู้สึกถูกต้อง)

คุณสามารถทำสิ่งนี้ได้

   (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)

รหัสนี้จะเพิ่มตัวเลือกที่ จำกัด ให้กับการดำเนินการเลือก jQuery ทั้งหมดที่ทำในขณะที่เมาส์อยู่ในองค์ประกอบบางอย่างเนื่องจาก HTML จะไม่ทำให้สับสน

(ยังดูเหมือนแฮ็กเกอร์อาจมีคนมีวิธีแก้ปัญหาที่ดีกว่า)

ไชโย


1

ใน Firebug คุณควรจะเห็นสคริปต์นั้นหลังจากโหลดเพจและสคริปต์ถูกแทรก เมื่อคุณทำเช่นนั้นคุณสามารถกำหนดจุดพักในตำแหน่งที่เหมาะสมและจะถูกเก็บรักษาไว้เมื่อคุณรีเฟรชหน้า


คุณถูก. ไม่ได้ผล ฉันลองใช้ eval () และ Firebug จะให้คุณตั้งค่าเบรกพอยต์เมื่อคุณใช้สิ่งนั้น มีเหตุผลที่คุณไม่สามารถใช้ eval () และจำเป็นต้องตั้งแท็กสคริปต์หรือไม่? โดยทั่วไปแล้วมีเหตุผลที่คุณไม่สามารถให้บริการจาวาสคริปต์แบบไดนามิกนี้เป็นไฟล์. js แยกต่างหากบนเซิร์ฟเวอร์ของคุณได้หรือไม่? คุณพยายามแก้ปัญหาอะไร
Moishe Lettvin

ฉันต้องการแก้ไข JavaScript บางส่วน (จำกัด ขอบเขตของตัวเลือก jQuery ทั้งหมดเป็น div มุมมองบางส่วนในปัจจุบัน) ก่อนที่จะดำเนินการ หรือคุณมีความคิดในการแก้ไขคำถามล่าสุดของฉัน สำหรับข้อมูลเพิ่มเติมโปรดดูคำถามล่าสุดของฉัน
Soul_Master

1

Javascript ที่โหลดแบบไดนามิกยังคงต้องถูกแยกวิเคราะห์โดยเบราว์เซอร์ซึ่งเป็นที่ที่ WebKit หรือ FireBug debugger นั่งอยู่ดังนั้นจึงขึ้นอยู่กับดีบักเกอร์ไม่ว่าจะเกิดอะไรขึ้นฉันคิดว่านี่เหมือนกันสำหรับเครื่องมือสำหรับนักพัฒนาใน IE8

ดังนั้นรหัสของคุณจึงอยู่ภายใต้การดีบักเกอร์ดังนั้นการที่คุณพบปัญหาจะไม่อยู่ในไฟล์หรือข้อความนั้นหากไม่มีข้อผิดพลาด

สิ่งอื่นscript.text = "alert('Test!');";ไม่ถูกต้องดังนั้นจึงไม่สามารถใช้ได้กับทุกเบราว์เซอร์สิ่งที่คุณต้องการคือscript.innerHTML = "alert('Test!');";

แม้ว่า innerHTML จะหมายถึงโค้ดภายในแท็ก HTML ไม่ใช่ HTML ที่อยู่ในกลุ่มคนที่ใช้มากที่สุดเท่านั้นจึงอธิบายผิด

แก้ไขเพื่ออัปเดต 2

และในการอัปเดตครั้งที่สองโดยใช้ Chrome ฉันทำสิ่งนี้

ไปที่ about: blank เปิดคอนโซลขึ้นและผ่านมา

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

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

จากนั้นมันจะแตกและเปิดแท็บสคริปต์โดยแสดง about: blank (ไม่มีอะไรให้ดู)

จากนั้นทางด้านขวามือจะแสดงรายการโทรสแตกจากนั้นคลิกที่สอง (ฟังก์ชันไม่ระบุชื่อ) และจะแสดงให้คุณเห็น

ดังนั้นในไฟล์ของคุณคุณจะมี (ฟังก์ชันที่ไม่ระบุชื่อ) ซึ่งเป็นรหัสที่คุณกำลังทำงานอยู่และคุณจะเห็นจุดพักในนั้น เพื่อให้คุณรู้จักคุณในสิ่งที่ถูกต้อง


0

ด้วยGoogle Chrome (หรือSafari ) Developers Tool คุณสามารถเรียกใช้ JavaScript ทีละบรรทัด สคริปต์

เครื่องมือสำหรับนักพัฒนาเลือกสคริปต์ที่คุณต้องการดีบักเครื่องหมายหยุดชั่วคราวทางด้านขวาหรือตั้งค่าจุดพักโดยคลิกที่หมายเลขบรรทัด>>>


0

ทางเลือกหนึ่งที่ฉันชอบใช้เพิ่มคำสั่ง console.log ('') ในโค้ดของฉัน เมื่อคำสั่งนี้ปรากฏในคอนโซลแล้วจะมีการเชื่อมโยงหมายเลขบรรทัดด้วย คุณสามารถคลิกหมายเลขนั้นเพื่อไปยังตำแหน่งในแหล่งที่มาและตั้งค่าเบรกพอยต์ ข้อเสียเปรียบของวิธีนี้คือเบรกพอยต์จะไม่ถูกเก็บรักษาไว้ระหว่างการโหลดหน้าเว็บซ้ำและคุณต้องรันโค้ดก่อนจึงจะสามารถเพิ่มดีบักเกอร์ได้


0

สำหรับเบราว์เซอร์ Google Chrome ในปัจจุบันหรือเบราว์เซอร์สมัยใหม่อื่น ๆ คุณสามารถค้นหาโค้ดที่ประเมินได้อย่างง่ายดายด้วยเครื่องมือสำหรับนักพัฒนาเช่นรูปภาพต่อไปนี้

  1. จำลองไฟล์โหลดแบบไดนามิก

ป้อนคำอธิบายภาพที่นี่

  1. กดCtrl + Shift + Fในแท็บแหล่งที่มาและค้นหาฟังก์ชันด้านบน

ป้อนคำอธิบายภาพที่นี่

สร้างเบรกพอยต์และรันฟังก์ชันเพื่อทดสอบ

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.