นโยบาย Chromium ในกล่องโต้ตอบ JavaScript

ประวัติกล่องโต้ตอบ JavaScript

JavaScript เปิดตัวในปี 1995 และใน JavaScript เวอร์ชันแรกสุดเป็นเมธอดในออบเจ็กต์หน้าต่างที่ชื่อ alert() confirm() และ prompt()

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

ด้วยเหตุนี้ ทีม Chromium จึงไม่แนะนำให้ใช้กล่องโต้ตอบ JavaScript

ตัวเลือกอื่นๆ

การแทนที่กล่องโต้ตอบมีตัวเลือกหลายรายการ

มีตัวเลือกหลายรายการสําหรับ alert()/confirm()/prompt() สำหรับการแจ้งเตือนผู้ใช้เกี่ยวกับเหตุการณ์ (เช่น เว็บไซต์ปฏิทิน) ควรใช้ Notifications API ในการรับข้อมูลจากผู้ใช้ ควรใช้องค์ประกอบ HTML <dialog> สำหรับการพิสูจน์แนวคิด XSS คุณสามารถใช้ console.log(document.origin) ของ devtool

สำหรับ onbeforeunload โปรดทราบว่ามีความเสถียรอยู่แล้ว ดังที่ Ilya Grigorik ได้บอกไว้ว่า "คุณไม่สามารถอาศัยเหตุการณ์ pagehide, beforeunload และ unload ให้เริ่มทำงานในแพลตฟอร์มอุปกรณ์เคลื่อนที่" หากต้องการบันทึกสถานะ คุณควรใช้ Page Visibility API

การเปลี่ยนแปลง

ความสามารถของหน้าเว็บในการระบุสตริง onbeforeunload ได้ถูกนำออกใน Chrome 51 (และถูกลบโดย Safari ที่เริ่มต้นด้วย Safari 9.1 และใน Firefox 4)

กล่องโต้ตอบ alert()/confirm()/prompt() เปลี่ยนจากการโมดัลแอปเป็นถูกปิดเมื่อสลับแท็บมาจาก การเปลี่ยนแปลงนี้เกิดขึ้นในทุกช่องในช่วงต้นเดือนพฤษภาคม 2017

กล่องโต้ตอบ beforeunload ต้องใช้ท่าทางสัมผัสของผู้ใช้ในหน้าเว็บเพื่อแสดงการเริ่มต้นใช้งานใน Chrome 60 (การดำเนินการนี้จะไม่เปลี่ยนแปลงการส่งเหตุการณ์ beforeunload) ซึ่งจะเป็นการปรับให้ Chromium สอดคล้องกับ Firefox ซึ่งทำการเปลี่ยนแปลงนี้ด้วย Firefox 44

การแสดงกล่องโต้ตอบ alert()/confirm()/prompt() ขณะอยู่ในโหมดเต็มหน้าจอจะทำให้โหมดเต็มหน้าจอหายไป นับตั้งแต่ Chrome 61 เป็นต้นไป

กล่องโต้ตอบ prompt() ไม่เปิดใช้งานแท็บ หากมีการเรียก prompt() จากแท็บพื้นหลัง การเรียกจะกลับมาทันทีและจะไม่มีกล่องโต้ตอบแสดงขึ้น การเปลี่ยนแปลงนี้เกิดขึ้นในทุกช่องเมื่อต้นเดือนพฤษภาคม 2017

กล่องโต้ตอบ alert() ไม่เปิดใช้งานแท็บ หากมีการเรียก alert() จากแท็บพื้นหลัง การเรียกจะกลับมาแสดงทันที แท็บจะมีสัญญาณบอกสถานะอยู่ และผู้ใช้จะเห็นกล่องโต้ตอบนี้เมื่อสลับไปยังแท็บ การเปลี่ยนแปลงลักษณะการทำงานนี้ พบได้ใน Chrome 64

กล่องโต้ตอบ confirm() ไม่เปิดใช้งานแท็บ หากมีการเรียก confirm() จากแท็บพื้นหลัง การเรียกจะกลับมาทันทีและจะไม่มีกล่องโต้ตอบแสดงขึ้น การเปลี่ยนแปลงลักษณะการทำงานนี้พบได้ใน Chrome 69

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