היסטוריה של תיבות דו-שיח ב-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.
בעקבות השינויים האלה, אם יש באתר תיבות דו-שיח, מומלץ מאוד לעבור להשתמש בחלופות שצוינו קודם לכן, כדי שזה לא ישפיע עליכם.