پیام جاوا اسکریپت قبل از بستن پنجره. JavaScript - Window Object: باز و بسته شدن پنجره ها. برای تست این مورد از چه چیزی استفاده کردیم؟

قبلاً چندین بار از من سؤال شده است که چگونه می توانم یک برگه را ببندم. فرض کنید کاربری می خواهد سایت شما را ببندد، و شما نوعی پنجره پاپ آپ ایجاد می کنید و می پرسید: مطمئنی؟"، یا به سایت دیگری هدایت کنید. البته این روش ها برای کاربران بسیار آزاردهنده است، بنابراین توصیه می کنم از آنها استفاده نکنید. خوشبختانه مرورگرها نیز با این کار بسیار ضعیف برخورد می کنند، با این حال، هنوز گزینه هایی برای کنترل بسته شدن تب وجود دارد.

این امکان وجود دارد که از کاربر بپرسید: " آیا او مطمئن است که می خواهد صفحه را ببندد؟در اینجا نحوه اجرای پردازش بستن برگه آمده است:


window.onbeforeunload = function() (
بازگشت "چیزی برای گفتن به کاربر"؛
}

این کد در فایرفاکس، اینترنت اکسپلورر، کروم کار می کند، اما در اپرا کار نمی کند (این مرورگر به هیچ وجه قبل از بارگیری پردازش نمی کند). در این حالت، خود تابع پردازش فقط می تواند یک رشته را برگرداند، یعنی هیچ تغییر مسیری در آنجا کار نخواهد کرد.

رشته برگشتی در پنجره تایید در کروم و IE نمایش داده می شود. این خط در فایرفاکس نمایش داده نمی شود.

"رویداد onbeforeunload متن ارائه شده توسط سایت را نمایش نمی دهد، فقط پیام استاندارد را نشان می دهد"، با قضاوت بر اساس نظرات، در نهایت و غیرقابل برگشت. در همین راستا خواستم کمی درباره تاریخچه موضوع بنویسم.

بسیاری از مردم می‌دانند که به لطف onbeforeunload، می‌توانید از کاربر بخواهید که اگر داده‌های ذخیره‌نشده‌ای دارد (مثلاً در یک فرم نوشته شده است، اما پیامی به انجمن ارسال نکرده است) صفحه وب را ترک نکند. برای انجام این کار، فقط چیزی شبیه به این جاوا اسکریپت اضافه کنید:
window.onbeforeunload = تابع (evt) ( var message = "سند "foo" ذخیره نشده است. اگر صفحه را ترک کنید تغییرات را از دست خواهید داد."; if (نوع evt == "تعریف نشده") ( evt = window.event ; ) if (evt) ( evt.returnValue = پیام؛ ) پیام را برگرداند؛ )
پس از این، در حالت ایده آل، اگر کاربر بخواهد صفحه را ترک کند (به هر نحوی - برگه را ببندید، کل مرورگر را ببندید، صفحه را بارگذاری مجدد کنید، یک آدرس جدید در نوار آدرس وارد کنید، به یک نشانک بروید و غیره)، او یک درخواست تایید می بیند و خروج از صفحه را می توان لغو کرد. پیش از این، نویسندگان وب‌سایت بی‌وجدان سعی می‌کردند از این پنجره برای گول زدن کاربر و نگه داشتن او در صفحه استفاده کنند، به عنوان مثال، با استفاده از متن «برای ادامه کار با سایت روی OK کلیک کنید و برای بسته شدن لغو کنید» (در واقع، دکمه‌ها با دیگری کار می‌کردند. راه دور). یا حتی چیزی ترسناک تر مانند «برای تأیید هزینه 1000 دلاری کارت اعتباری خود، تأیید را کلیک کنید».

سپس مرورگرها هوشمندتر شدند و شروع به اضافه کردن متن کمکی کردند تا فریب کاربر را دشوارتر کنند. به عنوان مثال، در اینجا نحوه انجام این کار توسط IE8 آمده است:

متن تقریبا مشابه در فایرفاکس 3 بود:


اگر همه آن را بخوانید، مشخص می شود که سایت چه چیزی را گزارش کرده و مرورگر چه چیزی را گزارش کرده است. با این حال، شما هنوز هم می توانید تقلب کنید.


در اینجا ما توضیح واضحی از اقدامات مستقیماً روی دکمه ها می بینیم. متقاعد کردن کاربر برای ماندن روی "ترک" و برای ترک "Stay" در حال حاضر بسیار دشوار است. به نظر من راه حل ایده آل است و این تاپیک را می توان بست. به طور کلی، همانطور که می دانید، OK بدون چهره تقریباً در هر گفتگو باید با نام عمل جایگزین شود (به عنوان مثال، "حذف فایل ها"، "جستجو"، "افزودن خط"، "فایل باز کردن"، و غیره) این تعداد خطاهای کاربر را کاهش می دهد، حتی اگر کنترل کاملی بر متن گفتگو داشته باشید.

درام با باگ 641509 چه بود؟ واقعیت این است که این تأیید در فایرفاکس 4 و بالاتر به این صورت است:


همانطور که می بینید، متن سفارشی به طور کلی ناپدید شده است. از نسخه 4، وب سایت نمی تواند هیچ پیام اضافی را به کاربر ارائه دهد یا توضیح دهد که چرا به طور خاص نمی خواهد کاربر را ترک کند. فرض کنید، اگر یک رابط برای کار با اسناد زیادی در یک پنجره پیاده‌سازی می‌کنید، و یکی از آنها ذخیره نشده است، می‌توانید مشخص کنید که کدام یک، اما در فایرفاکس شما این را متوجه نمی‌شوید. شاید شما نمی خواهید آن را ذخیره کنید و اگر پیام را می دیدید، با آرامش صفحه را ترک می کردید، اما در غیر این صورت نمی دانید چه خبر است. در برگه

در این درس با روش‌های مختلف شی پنجره آشنا می‌شویم که به شما امکان می‌دهد پنجره‌ها را باز و بسته کنید، بسته بودن پنجره را تعیین کنید و همچنین نام داخلی آن را دریافت کنید و غیره.

متدهای شی پنجره open() ، close() ، print() ،focus() و blur() می باشد.

در این بخش به روش های زیر از شی پنجره نگاه می کنیم:

  • open() - برای باز کردن پنجره ها (برگه ها) طراحی شده است.
  • close() - برای بستن پنجره ها طراحی شده است. عمدتا برای بستن پنجره های باز شده با استفاده از متد open() استفاده می شود.
  • print() - برای چاپ محتویات پنجره طراحی شده است.
  • focus() - برای انتقال تمرکز به پنجره مشخص شده طراحی شده است.
  • blur() - برای حذف فوکوس از پنجره مشخص شده طراحی شده است.
روش open(). این برنامه برای باز کردن یک پنجره (برگه) جدید در مرورگر طراحی شده است و دارای نحو زیر است:

پارامترهای روش:

  • پارامتر اول نشانی اینترنتی صفحه ای را که باید در این پنجره بارگذاری شود را مشخص می کند. اگر مقدار این پارامتر مشخص نشده باشد، یک صفحه خالی (about:blank) در پنجره نمایش داده می شود.
  • پارامتر دوم متد open مقدار مشخصه target یا نام پنجره را مشخص می کند. مقادیر زیر پشتیبانی می شوند:
    • _blank - URL در یک پنجره جدید (برگه) بارگذاری می شود. این مقدار پیش فرض است.
    • _parent - URL در قاب والد بارگذاری می شود. اگر آنجا نباشد، URL در پنجره فعلی (برگه) بارگذاری می شود.
    • _self - URL در پنجره فعلی بارگذاری می شود.
    • _top - همه فریم ها را لغو می کند و URL را در پنجره مرورگر فعلی (برگه) بارگیری می کند. اگر آنجا نباشد، URL در پنجره فعلی (برگه) بارگذاری می شود.
    • همچنین می توانید نام پنجره ای را برای باز شدن به عنوان پارامتر مشخص کنید. این نام داخلی است و توسعه دهندگان وب می توانند از آن برای فراخوانی توابع و متدهای این پنجره استفاده کنند.
  • پارامتر سوم برای تعیین مجموعه ای از ویژگی های پنجره است که با کاما از هم جدا شده اند. ویژگی های اصلی پنجره زیر پشتیبانی می شوند:
    • سمت چپ، بالا - مختصات (به پیکسل) گوشه سمت چپ بالای پنجره مرورگر نسبت به گوشه سمت چپ بالای صفحه. مقادیر این ویژگی ها باید مثبت یا برابر با 0 باشد.
    • ارتفاع، عرض - ارتفاع و عرض ناحیه کاری پنجره مرورگر. هنگام تعیین مقادیر، باید در نظر داشت که عرض و ارتفاع پنجره مرورگر نمی تواند کمتر از 100 پیکسل باشد.
    • resizable یک ویژگی پنجره Boolean است که برای فعال یا غیرفعال کردن قابلیت تغییر اندازه پنجره مرورگر طراحی شده است. این ویژگی مقادیر زیر را می پذیرد: yes یا 1 و no or 0;
    • Scrollbars یک ویژگی پنجره Boolean است که برای فعال یا غیرفعال کردن نمایش نوارهای پیمایش برای محتویات پنجره مرورگر استفاده می شود. این ویژگی مقادیر زیر را می پذیرد: yes یا 1 و no or 0;
    • status یک ویژگی پنجره منطقی است که برای فعال یا غیرفعال کردن نمایش نوار وضعیت مرورگر در نظر گرفته شده است. این ویژگی مقادیر زیر را می پذیرد: yes یا 1 و no یا 0.

به مثال های زیر توجه کنید:

1. یک صفحه خالی about:blank را در یک پنجره جدید باز کنید. این پنجره باید دارای عرض و ارتفاع 250 پیکسل باشد:

Window.open("""","width=250,height=250");

2. صفحه وب "http://site/" را در پنجره فعلی باز کنید:

Window.open("http://site/", "_self");

3. یک پنجره جدید با ویژگی های خاص باز کنید (top=100، left=100، width=400، height=500، scrollbars=yes، resizabie=yes):

Window.open("http://site", "_blank", "top=100, left=100, width=400, height=500, scrollbars=yes, resizable=yes");

چگونه پس از باز شدن پنجره با آن تعامل کنیم؟

متد open() به شما این امکان را می دهد که نه تنها یک پنجره را باز کنید، بلکه می توانید پیوندی به این پنجره نیز دریافت کنید. این پیوند به شما امکان می دهد با فراخوانی ویژگی ها و روش های خاصی با این پنجره تعامل داشته باشید. آن ها ما می توانیم از کد جاوا اسکریپت واقع در یک پنجره برای کنترل پنجره دیگر استفاده کنیم.

به عنوان مثال، برای دسترسی به شی سند یک پنجره باز:

یک پنجره خالی جدید باز کنید و متنی را در آن نمایش دهید:

Var myWindow = window.open("", "", "width=250, height=250"); myWindow.document.write("

مقداری متن

");

توجه: شما فقط می توانید با پنجره هایی که باز کرده اید تعامل داشته باشید، نمی توانید با پنجره های دیگر کار کنید.

متد close().

برای بستن پنجره طراحی شده است. این روش هیچ پارامتری نداره. معمولاً برای بستن پنجره های ایجاد شده توسط متد open() استفاده می شود. در غیر این صورت، هنگامی که سعی می کنید پنجره (برگه) باز شده توسط خود کاربر (نه از جاوا اسکریپت) را ببندید، مرورگر به دلایل امنیتی از کاربر درخواست تایید برای انجام این عمل می کند.

به عنوان مثال، اجازه دهید دکمه هایی برای باز و بسته کردن پنجره ای به نام myWindow ایجاد کنیم:

//یک متغیر ایجاد کنید که در آن یک مرجع به شی پنجره پنجره باز var myWindow ذخیره می کنیم. تابع myWindowOpen ( myWindow = window.open("http://www.yandex.ru"، "myWindow"، "width=250, height=250")؛ ) تابع myWindowClose ( if (myWindow) (myWindow.close() ؛ myWindow = null؛ ) ) باز کردن پنجره بستن پنجره

روش print().

برای چاپ محتویات یک پنجره طراحی شده است. این روش هیچ پارامتری نداره.

تابع myPrint() ( window.print(); ) یک صفحه را چاپ کنید

روش focus()

برای تمرکز بر پنجره مشخص شده طراحی شده است. این روش هیچ پارامتری نداره.

روش blur().

در نظر گرفته شده است که فوکوس را از یک پنجره مشخص حذف کند، به عنوان مثال. آن را به پس زمینه منتقل می کند. این روش هیچ پارامتری نداره.

تابع myWindowOpen() ( var myWindow = window.open(""، ""، "width=200,height=100"); ) function myWindowFocus() ( myWindow.focus(); ) تابع myWindowBlur() ( myWindow.blur (; ) باز کردن پنجره تمرکز دادن به پنجره انتقال پنجره به پس زمینه

ویژگی های شی پنجره: نام، بازکننده، بسته.

در این بخش، ویژگی های زیر شی پنجره را بررسی می کنیم:

  • نام - برای بدست آوردن یا تنظیم نام داخلی پنجره در نظر گرفته شده است.
  • بازکننده - به شما امکان می دهد در پنجره فعلی پیوندی به پنجره (شیء پنجره) که این پنجره از آن باز شده است را دریافت کنید.
  • بسته یک ویژگی بولی است که برمی‌گرداند: اگر پنجره بسته باشد true و اگر پنجره باز باشد false.
نام ویژگی

این ویژگی اغلب برای تغییر نام داخلی یک پنجره پس از باز شدن آن استفاده می شود. علاوه بر این، ویژگی name می تواند مقدار فعلی نام داخلی پنجره را برگرداند.

نام داخلی پنجره رشته ای نیست که بین تگ های باز و بسته شدن عنوان محصور شده باشد - نام پنجره ای است که برای توسعه دهنده در نظر گرفته شده است. آن ها این نام برای کاربر نامرئی است.

این نام عمدتاً در پیوندها و فرم ها برای نشان دادن پنجره ای که صفحه باید در آن باز شود استفاده می شود. به عنوان مثال، برای نشان دادن نام داخلی یک پنجره در یک هایپرلینک، از ویژگی target استفاده می شود. اگر عنصر a دارای ویژگی target="searchWindow" باشد، وقتی روی این پیوند کلیک می کنید، مرورگر ابتدا سعی می کند پنجره ای با آن پیدا کند. چنین نام داخلی (searchWindow)، اگر هیچ پنجره ای با چنین نام داخلی وجود نداشته باشد، یک پنجره جدید باز می کند و نام آن را searchWindow می گذارد. و اگر پنجره ای با همین نام وجود داشته باشد، پنجره جدیدی باز نمی شود، اما صفحه با استفاده از پیوند مشخص شده در این پنجره بارگذاری مجدد می شود. به طور پیش فرض، پنجره های مرورگر نام داخلی ندارند.

به عنوان مثال، اجازه دهید صفحه "http://www.google.com/" را در پنجره ای به نام myWindow باز کنیم:

window.name = "myWindow";

برای مثال، بیایید یک پنجره را با استفاده از متد open() باز کنیم و نام آن را در آن نمایش دهیم:

var wnd = window.open("","myTest", "width=200, height=300"); wnd.document.write("

این پنجره دارای نام است: " + wnd.name + ".");

دارایی بازکن

این ویژگی به شما این امکان را می دهد که در یک پنجره پیوندی به پنجره اصلی (ابجکت پنجره) دریافت کنید. به پنجره ای که از آن پنجره باز شد.

به عنوان مثال، شما یک پنجره اصلی (1) دارید که در آن از روش open() برای باز کردن یک پنجره دیگر (2) استفاده می کنید. در این پنجره (2) می توانید از ویژگی opener برای دریافت پنجره (1) استفاده کنید.

تابع openMyWindow() ( var myWindow=window.open("""","width=200,height=200"); myWindow.document.write("باز کردن پنجره (2)"); $(document).ready (function(( updatefgallowPrompt(true); window.onbeforeunload = WarnUser; ) تابع WarnUser() ( var allowPrompt = getfgallowPrompt(); if(allowPrompt) ( saveIndexedDataAlert(); null را برگرداند؛ ) else ( updatefgallowPrompt(t); .stopPropagation ) تابع saveIndexedDataAlert() ( var allowPrompt = getfgallowPrompt(); var lenIndexedDocs = parseInt($("#sortable3 > li").size()) + parseInt($("#sortable3 > ul").size( ))؛ if(allowPrompt && $.trim(lenIndexedDocs) > 0) ( event.returnValue = "پیام شما"; } else { event.returnValue = " "; updatefgallowPrompt(true); } } $(document).click(function(event) { $("a").live("click", function() { updatefgallowPrompt(false); }); }); function updatefgallowPrompt (allowPrompt){ //exit msg dfds $("body").data("allowPrompt", allowPrompt); } function getfgallowPrompt(){ return $("body").data("allowPrompt"); }!}

پس از آن برای من کار کرد.

$(window).unload(function(event) ( if(event.clientY< 0) { //do whatever you want when closing the window.. } });

Window.onbeforeunload = تابع () ( بازگشت "آیا واقعاً می خواهید ببندید؟"؛ );

شاید فقط یک کنترل کننده رویداد قبل از بارگیری در کنترل کننده رویداد ارسال فرم:

JQuery("form").submit(function() ( jQuery(window).unbind("beforeunload"); ... ));

2

من یک صفحه والدین و یک صفحه فرزند دارم. صفحه فرزند در برگه جدید باز شد

من می خواهم یک پیام هشدار (صفحه کودک بسته می شود) را هنگام بستن برگه فرزند نشان دهم.
چگونه پیام های بسته را هنگام بستن برگه نشان دهیم؟ (زمان شادابی نیست)

من از OnUnload و onbeforeunload استفاده کردم.
این دو روش هنگام بازخوانی صفحه و بستن برگه ها نیز فراخوانی می شوند.

Window.onunload = تابع doUnload(e) ( هشدار ("پنجره کودک در حال بسته شدن است...")؛ )

Window.onbeforeunload = تابع doUnload(e) ( هشدار ("پنجره کودک در حال بسته شدن است...")؛ )

من باید پیام هشدار را نشان دهم، فقط تب را در مرورگر ببندید.

کمکم کنید. پیشاپیش ممنون

من از اسکریپت زیر استفاده میکنم در IE کار کرد. اما در فایرفاکس کار نکرد

window.onbeforeunload = function() ( if ((window.event.clientX< 0) || (window.event.clientY < 0) || (window.event.clientX < -80)) { alert("Child window is closing..."); } };

نحوه دستیابی به این امر در فایرفاکس و سایر مرورگرها.

  • 4 پاسخ
  • مرتب سازی:

    فعالیت

1

برای این afaik هرگز یک سناریوی متقابل مرورگر نبود. راه حل این است که برای شناسایی هر چیز مهمی به ویژگی های غیرمستند و متغیر خاص مرورگر اعتماد نکنید.

از آنجایی که شما یک صفحه CHILD دارید، می توانید آزمایشی را روی والد (بازکننده) تنظیم کنید که ویژگی childWindowHandle.closed را در فواصل زمانی بررسی می کند و بر اساس آن عمل می کند.

1

با فرض اینکه فقط سعی می کند رویداد قبل از بارگیری Crossbrowser را فعال کند، تقریباً این کار را انجام می دهد (به جز در Opera)

Try(// http://www.opera.com/support/kb/view/827/ opera.setOverrideHistoryNavigationMode("compatible"); history.navigationMode = "compatible"; )catch(e)() //Our Where تابع پیام F" Are You Going ReturnMessage() ("WTF!!!"; ) //تابع تابع UnBind UnBindWindow() (window.onbeforeunload = null; return true; ) //پیوندهایی که نمی خواهیم روی سند تاثیر بگذارند .getElementById("homebtn").onclick = UnBindWindow; document.getElementById("googlebtn").onclick = UnBindWindow؛ //Bind خروج از پیام گفتگو window.onbeforeunload = ReturnMessage;

0

ممکن است نتوانید این کار را انجام دهید، مگر برای برخی از روش‌های مبتنی بر کوکی، که کار ایجاد راه‌حل‌هایی به عنوان کوکی‌های غیرمداوم است. شناسایی دوم بازخوانی صفحه، تغییر مسیر مبتنی بر فرم یا تغییر مسیر معکوس یا بسته شدن مرورگر با حذف رویداد ساده و خسته کننده نیست. توصیه می کنیم به این موضوع وابسته نباشید.

قبل از اینکه مشتری برگه را ببندد، می توانید کارهای کوچکی انجام دهید. جاوا اسکریپت بستن برگه مرورگر/بستن مرورگر را تشخیص می‌دهد، اما اگر لیست اقدامات شما بزرگ است و برگه قبل از تکمیل بسته می‌شود، درمانده هستید. می توانید امتحان کنید، اما با تجربه من به آن بستگی ندارد. بله، در این زمان نمی‌توانید برگشت، به‌روزرسانی و بستن را متمایز کنید. بنابراین، هیچ راه قابل اعتمادی برای تشخیص اینکه آیا یک کودک واقعا بسته است وجود ندارد.

Window.addEventListener("beforeunload", تابع (e) ( var confirmationMessage = "\o/"; /* آیا کد اقدام کوچکی را در اینجا وارد می کنید */ (e || window.event).returnValue = confirmationMessage; //Gecko + IE بازگشت تایید پیام؛ //Webkit، Safari، Chrome ));