מדיניות Chromium בתיבות דו-שיח של JavaScript

היסטוריה של תיבות דו-שיח ב-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.

בעקבות השינויים האלה, אם יש באתר תיבות דו-שיח, מומלץ מאוד לעבור להשתמש בחלופות שצוינו קודם לכן, כדי שזה לא ישפיע עליכם.