היסטוריה של תיבות דו-שיח ב-JavaScript
JavaScript הושק בשנת 1995, ובגרסה הראשונה שלו כללנו שיטות לאובייקט החלון, שנקרא alert(), confirm() ו-prompt().
הם מתאימים ל-JavaScript של אותה תקופה, אבל ה-API הסינכרוני שלהם בעייתי לדפדפנים מודרניים. מכיוון שמנוע ה-JavaScript צריך להשהות עד שמתקבלת תגובת המשתמש, תיבות הדו-שיח של JavaScript הן מודליות של אפליקציה. ומכיוון שתיבות הדו-שיח הן מודליות של אפליקציה, בדרך כלל הן משמשות (ולרוב) כדי לפגוע במשתמשים שלנו.
מסיבה זו, צוות Chromium ממליץ בחום לא להשתמש בתיבות דו-שיח של JavaScript.
חלופות
קיימות אפשרויות רבות להחלפה בתיבת הדו-שיח.
יש כמה אפשרויות לגבי alert()/confirm()/prompt(). כדי לשלוח למשתמשים הודעות על אירועים (למשל, אתרים של לוחות שנה), צריך להשתמש ב-Notifications API. כדי לקבל קלט של משתמשים, יש להשתמש ברכיב <dialog> של HTML. לצורך הוכחת היתכנות של XSS, אפשר להשתמש ב-console.log(document.origin) של devtool.
לגבי onbeforeunload, יש לציין שהיא כבר לא אמינה. כפי שאיליה גריגוריק ציינת,
"אי אפשר להסתמך על האירועים pagehide, beforeunload ו-unload כך שיופעלו בפלטפורמות לנייד". אם אתם צריכים לשמור מצב, כדאי להשתמש בממשק ה-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.
בעקבות השינויים האלה, אם יש באתר תיבות דו-שיח, מומלץ מאוד לעבור להשתמש בחלופות שצוינו קודם לכן, כדי שזה לא ישפיע עליכם.