จะดีบัก JavaScript ที่โหลดแบบไดนามิก (ด้วย jQuery) ในตัวดีบักเกอร์ของเบราว์เซอร์ได้อย่างไร?


92

สคริปต์ที่เพิ่มแบบไดนามิกจะไม่ปรากฏในส่วนสคริปต์ของดีบักเกอร์ของเบราว์เซอร์

คำอธิบาย:

ฉันจำเป็นต้องใช้และได้ใช้

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

เพื่อให้ myScript.js สามารถโหลดได้แบบไดนามิกเมื่อตรงตามเงื่อนไขบางอย่าง ... และ myFunction สามารถเรียกได้หลังจากโหลดสคริปต์ทั้งหมดแล้วเท่านั้น ...

แต่เบราว์เซอร์ไม่แสดง myScript.js ที่โหลดแบบไดนามิกในส่วนสคริปต์ของดีบักเกอร์

มีวิธีอื่นอีกหรือไม่เพื่อให้บรรลุเป้าหมายทั้งหมดซึ่งจะทำให้สามารถดีบักสคริปต์ที่โหลดแบบไดนามิกในเบราว์เซอร์ได้หรือไม่?



2
ใช้debugger;เพื่อหยุดอัตโนมัติในสคริปต์โหลดแบบไดนามิกโปรดดูjavascript.info/debugging-chrome
yu yang Jian

คำตอบ:


208

คุณสามารถตั้งชื่อสคริปต์ที่โหลดแบบไดนามิกเพื่อให้แสดงในโปรแกรมแก้ไขข้อบกพร่อง JavaScript ของ Chrome / Firefox ในการดำเนินการนี้คุณต้องแสดงความคิดเห็นที่ส่วนท้ายของสคริปต์:

//# sourceURL=filename.js

ไฟล์นี้จะแสดงใน "แหล่งที่มาของ" filename.jsแท็บ จากประสบการณ์ของฉันคุณสามารถใช้ในชื่อได้ แต่ฉันมีพฤติกรรมแปลก ๆ หากใช้ / 's

สำหรับข้อมูลเพิ่มเติมโปรดดู: เบรกพอยต์ในการ เลิกใช้JavaScript แบบไดนามิกของ // @ sourceurl


19
โปรดทราบว่าจะเปลี่ยนเป็น // # แม้ว่า // @ จะยังใช้งานได้ใน Chrome สคริปต์ในไฟล์. html สามารถตั้งชื่อในลักษณะเดียวกันได้ ระวัง! อย่าเว้นว่างก่อนและหลังเครื่องหมาย '='
Mert Mertce

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

7
เพียงแค่เคล็ดลับ โปรแกรมแก้ไขจุดบกพร่องของ Chrome จะพ่นไฟล์ pseudo-javascript ลงในองค์ประกอบโหนด "(no domain)" ในแท็บ Sources อย่างน้อยที่สุดเมื่อทำการดีบักบน localhost นั่นคือที่ที่ฉันพบพวกเขา
Robert Oschler

1
สิ่งที่ต้องระวังอีกอย่างคือรูปแบบการแสดงความคิดเห็น ลิงก์ "การเลิกใช้งานของ / / @ sourceURL" ที่คุณให้กล่าวถึงทั้ง "// # sourceURL =" และ "/ * # sourceURL =" นั่นเป็นเพราะสิ่งนี้สามารถใช้กับ CSS ได้เช่นกันซึ่งคุณต้องใช้บล็อกความคิดเห็นเนื่องจากความคิดเห็น "//" บรรทัดเดียวไม่ถูกต้อง สิ่งที่ทำให้ฉันประหลาดใจคือคุณไม่สามารถใช้ "/ * sourceURL =" ในจาวาสคริปต์ มันถูกละเลย
Jools

2
Afaik ตัวย่อ JavaScript ส่วนใหญ่จะลบบรรทัดเหล่านี้ออกจากขั้นตอนการผลิตทำให้ไม่มีประโยชน์สำหรับการวินิจฉัยจุดบกพร่องในการผลิต
LluísSuñol

16

คุณสามารถใช้//# sourceURL=และ//# sourceMappingURL=อยู่ท้ายไฟล์สคริปต์หรือแท็กสคริปต์ของคุณ

หมายเหตุ: //@ sourceURLและ//@ sourceMappingURLเลิกใช้แล้ว


ข้อมูลการเลิกใช้งานเพิ่มเติม: developers.google.com/web/updates/2013/06/…
Pysis

แน่นอน แต่เครื่องบดย่อยส่วนใหญ่ของ afaik จะลบบรรทัดนี้ในขั้นตอนการผลิต
LluísSuñol

13

ฉันลองใช้ "// # sourceURL = filename.js" ที่ OP แนะนำเป็นวิธีแก้ปัญหาชั่วคราว แต่ยังไม่ปรากฏให้ฉันเห็นในแผงแหล่งที่มาเว้นแต่จะมีอยู่ในแท็บของฉันจากครั้งก่อนเมื่อ มันทำให้เกิดข้อยกเว้น

การเข้ารหัส "debugger;" เส้นบังคับให้แตกที่ตำแหน่งนั้น จากนั้นเมื่ออยู่ในแท็บของฉันในแผงแหล่งที่มาฉันสามารถตั้งค่าเบรกพอยต์ได้ตามปกติและลบ "ดีบักเกอร์;" ไลน์.


6
นอกจากนี้ยังอาจปรากฏในรายการ (ไม่มีโดเมน) ภายใต้แท็บแหล่งที่มา
Splaktar

1
ฉันต้องใช้debugger;ด้วยและ DevTools ต้องเปิดในขณะที่สคริปต์กำลังโหลด
Barmar

2
ข้อมูลเพิ่มเติมเล็กน้อย: ใช้เบราว์เซอร์: // เป็นโปรโตคอลเช่นเดียวกับใน //# sourceURL=browsertools://yourdomaingoeshere.com/action-openuwws.js
dolbysurnd

6

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

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


2
สิ่งนี้ช่วยฉันได้! ไม่ว่าฉันจะทำอะไรไฟล์ก็ไม่ปรากฏจนกว่าฉันจะใส่คำสั่งดีบักเกอร์ หลังจากนั้นจะยังคงอยู่ในการรีโหลดหน้าและเซสชันการดีบักแม้ว่าฉันจะลบคำสั่งดีบักเกอร์แล้วก็ตาม
Mike Devenney

0

เมื่อพยายามติดตามสิ่งนี้ใน IE ฉันเปิดเครื่องมือ dev (F12) จากนั้นค้นหาตำแหน่งที่จะวางเบรกพอยต์โดยใช้บรรทัดต่อไปนี้ในคอนโซล:

debugger;myFunction();

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

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