Nhật ký hộp thoại JavaScript
JavaScript được giới thiệu vào năm 1995 và trong phiên bản đầu tiên của JavaScript là các phương thức trên đối tượng cửa sổ có tên là alert()
, confirm()
và prompt()
.
Mặc dù phù hợp với JavaScript thời đó, nhưng API đồng bộ của chúng lại có vấn đề đối với các trình duyệt hiện đại. Vì công cụ JavaScript cần tạm dừng cho đến khi nhận được phản hồi của người dùng, nên các hộp thoại JavaScript sẽ ở chế độ ứng dụng. Và vì hộp thoại là phương thức ứng dụng, nên chúng thường (và đáng tiếc là) được dùng để gây hại người dùng của chúng tôi.
Do đó, nhóm Chromium khuyên bạn không nên sử dụng hộp thoại JavaScript.
Lựa chọn thay thế
Có nhiều lựa chọn để thay thế hộp thoại.
Có nhiều lựa chọn cho alert()/confirm()/prompt()
. Để thông báo cho người dùng về các sự kiện (ví dụ: trang web đặt lịch), bạn nên sử dụng API thông báo. Để lấy thông tin đầu vào của người dùng, bạn nên sử dụng phần tử HTML <dialog>
. Đối với bằng chứng về khái niệm của XSS, bạn có thể sử dụng console.log(document.origin)
của công cụ cho nhà phát triển.
Đối với onbeforeunload
, cần lưu ý rằng mã này đã không đáng tin cậy. Như Ilya Grigorik chỉ ra, "Bạn không thể dựa vào các sự kiện pagehide
, beforeunload
và unload
để kích hoạt trên nền tảng di động". Nếu cần lưu trạng thái, bạn nên sử dụng API Chế độ hiển thị trang.
Các thay đổi
Khả năng một trang chỉ định chuỗi onbeforeunload
đã bị xoá trong Chrome 51.
(Nó cũng đã bị xoá bởi Safari kể từ Safari 9.1 và trong Firefox 4.)
Hộp thoại alert()/confirm()/prompt()
đã thay đổi từ chế độ ứng dụng thành bị loại bỏ khi thẻ được chuyển từ. Thay đổi này diễn ra trên tất cả các kênh vào đầu tháng 5 năm 2017.
Hộp thoại beforeunload
yêu cầu cử chỉ của người dùng trên trang để cho phép hiển thị kể từ Chrome 60.
(Thao tác này không thay đổi việc gửi sự kiện beforeunload
.) Phương thức này căn chỉnh
Chromium với Firefox, đã thực hiện thay đổi này với Firefox 44.
Kể từ Chrome 61, việc hiển thị hộp thoại alert()/confirm()/prompt()
ở chế độ toàn màn hình sẽ khiến
toàn màn hình bị mất.
Các hộp thoại prompt()
không kích hoạt thẻ của chúng. Nếu prompt()
được gọi từ một thẻ trong nền, thì lệnh gọi sẽ trả về ngay lập tức và không có hộp thoại nào xuất hiện.
Thay đổi này đã áp dụng trên tất cả các kênh vào đầu tháng 5 năm 2017.
Các hộp thoại alert()
không kích hoạt thẻ của chúng. Nếu alert()
được gọi từ một thẻ trong nền, thì lệnh gọi sẽ trả về ngay lập tức. Thẻ này được đánh dấu bằng một chỉ báo và người dùng sẽ thấy hộp thoại khi chuyển sang thẻ đó. Bạn có thể thấy sự thay đổi này về hành vi kể từ phiên bản Chrome 64.
Các hộp thoại confirm()
không kích hoạt thẻ của chúng. Nếu confirm()
được gọi từ một thẻ trong nền, thì lệnh gọi sẽ trả về ngay lập tức và không có hộp thoại nào xuất hiện.
Bạn có thể nhận thấy sự thay đổi này về hành vi kể từ phiên bản Chrome 69.
Do những thay đổi này, nếu trang web của bạn sử dụng hộp thoại, bạn nên chuyển sang sử dụng các phương án thay thế đã đề cập trước đó để điều này không ảnh hưởng đến bạn.