تاریخچه دیالوگ های جاوا اسکریپت
جاوا اسکریپت در سال 1995 معرفی شد و در اولین نسخه جاوا اسکریپت متدهایی روی شی پنجره به نامهای alert()
، confirm()
و prompt()
وجود داشت.
در حالی که آنها در جاوا اسکریپت آن زمان قرار می گیرند، API همزمان آنها برای مرورگرهای مدرن مشکل ساز است. از آنجایی که موتور جاوا اسکریپت باید تا زمانی که پاسخ کاربر به دست آید، مکث کند، گفتگوهای جاوا اسکریپت به صورت برنامه-مدال هستند. و از آنجایی که دیالوگ ها به صورت برنامه ای هستند، معمولا (و متاسفانه) برای آسیب رساندن به کاربران ما استفاده می شوند.
به همین دلیل، تیم Chromium شدیداً توصیه میکند که از گفتگوهای جاوا اسکریپت استفاده نکنید.
جایگزین، گزینه ها
گزینه های زیادی برای جایگزینی دیالوگ وجود دارد.
چندین گزینه برای alert()/confirm()/prompt()
وجود دارد. برای اطلاع دادن به کاربر در مورد رویدادها (به عنوان مثال سایت های تقویم)، باید از 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()
از app-modal به رد شدن زمانی که برگه آنها از . این تغییر در همه کانال ها در ابتدای می 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 شروع میشود.
به دلیل این تغییرات، اگر سایت شما از دیالوگها استفاده میکند، به شدت توصیه میشود که از گزینههای ذکر شده قبلی استفاده کنید تا بر شما تأثیری نگذارد.