วิธีรับองค์ประกอบสคริปต์ปัจจุบัน:
1. การใช้งาน document.currentScript
document.currentScript
จะคืน<script>
องค์ประกอบที่สคริปต์กำลังดำเนินการอยู่
<script>
var me = document.currentScript;
</script>
ประโยชน์ที่ได้รับ
- ง่ายและชัดเจน น่าเชื่อถือ
- ไม่จำเป็นต้องแก้ไขแท็กสคริปต์
- ทำงานร่วมกับสคริปต์แบบอะซิงโครนัส (
defer
& async
)
- ทำงานร่วมกับสคริปต์ที่แทรกแบบไดนามิก
ปัญหาที่เกิดขึ้น
- จะไม่ทำงานในเบราว์เซอร์ที่เก่ากว่าและ IE
- ไม่ทำงานกับโมดูล
<script type="module">
2. เลือกสคริปต์ตามรหัส
ให้สคริปต์แอตทริบิวต์ ID จะช่วยให้คุณสามารถเลือกของคุณ id document.getElementById()
จากภายในโดยใช้
<script id="myscript">
var me = document.getElementById('myscript');
</script>
ประโยชน์ที่ได้รับ
- ง่ายและชัดเจน น่าเชื่อถือ
- รองรับเกือบทุกระดับ
- ทำงานร่วมกับสคริปต์แบบอะซิงโครนัส (
defer
& async
)
- ทำงานร่วมกับสคริปต์ที่แทรกแบบไดนามิก
ปัญหาที่เกิดขึ้น
- ต้องเพิ่มแอตทริบิวต์ที่กำหนดเองลงในแท็กสคริปต์
id
คุณลักษณะอาจทำให้พฤติกรรมแปลก ๆ สำหรับสคริปต์ในเบราว์เซอร์บางกรณีขอบบาง
3. เลือกสคริปต์โดยใช้data-*
แอตทริบิวต์
ให้สคริปต์data-*
คุณลักษณะที่จะช่วยให้คุณสามารถเลือกได้อย่างง่ายดายจากภายใน
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
สิ่งนี้มีประโยชน์น้อยกว่าตัวเลือกก่อนหน้า
ประโยชน์ที่ได้รับ
- ง่ายและชัดเจน
- ทำงานร่วมกับสคริปต์แบบอะซิงโครนัส (
defer
& async
)
- ทำงานร่วมกับสคริปต์ที่แทรกแบบไดนามิก
ปัญหาที่เกิดขึ้น
- ต้องเพิ่มแอตทริบิวต์ที่กำหนดเองลงในแท็กสคริปต์
- HTML5 และ
querySelector()
ไม่เข้ากันได้กับทุกเบราว์เซอร์
- สนับสนุนอย่างกว้างขวางน้อยกว่าการใช้
id
แอตทริบิวต์
- จะได้รับรอบ
<script>
กับid
กรณีขอบ
- อาจสับสนหากองค์ประกอบอื่นมีข้อมูลและค่าเดียวกันในหน้า
4. เลือกสคริปต์ตาม src
แทนที่จะใช้คุณลักษณะข้อมูลคุณสามารถใช้ตัวเลือกเพื่อเลือกสคริปต์ตามแหล่งที่มา:
<script src="//example.com/embed.js"></script>
ใน embed.js:
var me = document.querySelector('script[src="//example.com/embed.js"]');
ประโยชน์ที่ได้รับ
- น่าเชื่อถือ
- ทำงานร่วมกับสคริปต์แบบอะซิงโครนัส (
defer
& async
)
- ทำงานร่วมกับสคริปต์ที่แทรกแบบไดนามิก
- ไม่จำเป็นต้องมีแอตทริบิวต์หรือรหัสที่กำหนดเอง
ปัญหาที่เกิดขึ้น
- ไม่ได้ทำงานให้กับสคริปต์ท้องถิ่น
- จะทำให้เกิดปัญหาในสภาพแวดล้อมต่าง ๆ เช่นการพัฒนาและการผลิต
- คงที่และเปราะบาง การเปลี่ยนตำแหน่งของไฟล์สคริปต์จะต้องมีการแก้ไขสคริปต์
- สนับสนุนอย่างกว้างขวางน้อยกว่าการใช้
id
แอตทริบิวต์
- จะทำให้เกิดปัญหาหากคุณโหลดสคริปต์เดียวกันสองครั้ง
5. วนรอบสคริปต์ทั้งหมดเพื่อค้นหาสิ่งที่คุณต้องการ
นอกจากนี้เรายังสามารถวนรอบทุกองค์ประกอบของสคริปต์และตรวจสอบแต่ละรายการเพื่อเลือกองค์ประกอบที่เราต้องการ:
<script>
var me = null;
var scripts = document.getElementsByTagName("script")
for (var i = 0; i < scripts.length; ++i) {
if( isMe(scripts[i])){
me = scripts[i];
}
}
</script>
วิธีนี้ทำให้เราสามารถใช้ทั้งเทคนิคก่อนหน้านี้ในเบราว์เซอร์รุ่นเก่าที่ไม่รองรับquerySelector()
คุณสมบัติต่างๆ ตัวอย่างเช่น:
function isMe(scriptElem){
return scriptElem.getAttribute('src') === "//example.com/embed.js";
}
สิ่งนี้ได้รับประโยชน์และปัญหาของวิธีการใดก็ตามที่ได้รับมา แต่ไม่พึ่งพาquerySelector()
ดังนั้นจะทำงานในเบราว์เซอร์รุ่นเก่า
6. รับสคริปต์ที่ดำเนินการครั้งสุดท้าย
เนื่องจากสคริปต์ถูกเรียกใช้งานตามลำดับองค์ประกอบสคริปต์ล่าสุดมักจะเป็นสคริปต์ที่ทำงานอยู่ในปัจจุบัน:
<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>
ประโยชน์ที่ได้รับ
- ง่าย
- รองรับเกือบทุกระดับ
- ไม่จำเป็นต้องมีแอตทริบิวต์หรือรหัสที่กำหนดเอง
ปัญหาที่เกิดขึ้น
- ไม่ได้ทำงานกับสคริปต์ไม่ตรงกัน (
defer
& async
)
- ไม่ได้ทำงานกับสคริปต์แทรกแบบไดนามิก