Oynani yopishdan oldin Javascript xabari. JavaScript - Oyna ob'ekti: oynalarni ochish va yopish. Buni sinab ko'rish uchun nimadan foydalandik?

Mendan bir necha marta yorliqni yopishni qanday boshqarish kerakligi so'ralgan. Aytaylik, foydalanuvchi saytingizni yopmoqchi, siz esa qandaydir qalqib chiquvchi oyna ochasiz va so'raysiz: " Ishonchingiz komilmi?", yoki boshqa saytga yo'naltiring. Albatta, bu usullar foydalanuvchilarni juda bezovta qiladi, shuning uchun men ulardan foydalanmaslikni maslahat beraman. Yaxshiyamki, brauzerlar ham buni juda yomon hal qilishadi, ammo yorliqlarni yopish bilan shug'ullanish uchun hali ham ba'zi variantlar mavjud.

Foydalanuvchidan so'rash mumkin: " U sahifani yopishni xohlayotganiga aminmi?". Varaqni yopish jarayonini qanday amalga oshirishingiz mumkin:


window.onbeforeunload = function() (
"Foydalanuvchiga aytadigan narsa" ni qaytaring;
}

Ushbu kod Firefox, IE, Chrome-da ishlaydi, lekin Opera-da ishlamaydi (bu brauzer yuklab olishdan oldin umuman ishlamaydi). Bunday holda, qayta ishlash funktsiyasining o'zi faqat satrni qaytarishi mumkin, ya'ni u erda hech qanday yo'naltirish ishlamaydi.

Qaytarilgan qator Chrome va IE da tasdiqlash oynasida ko'rsatiladi. Ushbu qator Firefox-da ko'rinmaydi.

"onbeforeunload hodisasi sayt tomonidan taqdim etilgan matnni ko'rsatmaydi, faqat standart xabarni ko'rsatmaydi", sharhlarga ko'ra, nihoyat va qaytarib bo'lmaydigan. Shu munosabat bilan men masalaning tarixi haqida bir oz yozmoqchi bo'ldim.

Ko'pchilik biladiki, yuklashdan oldin, siz foydalanuvchidan saqlanmagan ma'lumotlarga ega bo'lsa (masalan, shaklda yozilgan, lekin forumga xabar yuborilmagan) veb-sahifani tark etmaslikni so'rashingiz mumkin. Buni amalga oshirish uchun quyidagi JavaScript-ni qo'shing:
window.onbeforeunload = function (evt) ( var message = ""foo" hujjati saqlanmadi. Agar sahifani tark etsangiz, siz o'zgarishlarni yo'qotasiz."; if (typeof evt == "aniqlanmagan") ( evt = window.event ; ) agar (evt) ( evt.returnValue = xabar; ) xabarni qaytarish; )
Shundan so'ng, ideal holda, agar foydalanuvchi sahifani tark etmoqchi bo'lsa (har qanday tarzda - yorliqni yoping, butun brauzerni yoping, sahifani qayta yuklang, manzil satriga yangi manzilni kiriting, xatcho'pga o'ting va hokazo), u tasdiqlash so'rovini ko'rasiz va sahifani tark etish bekor qilinishi mumkin. Ilgari, vijdonsiz veb-sayt mualliflari foydalanuvchini aldash va uni sahifada ushlab turish uchun ushbu oynadan foydalanishga harakat qilishgan, masalan, "Sayt bilan ishlashni davom ettirish uchun OK ni bosing va yopish uchun Bekor qilish" matni yordamida (aslida, tugmalar boshqa ishlagan. yo'l). Yoki “Kredit kartangizdan 1000 dollarlik to‘lovni tasdiqlash uchun OK tugmasini bosing” kabi qo‘rqinchliroq narsa.

Keyin brauzerlar dono bo'lib, foydalanuvchini aldashni qiyinlashtirish uchun yordamchi matnni qo'shishni boshladilar. Masalan, IE8 buni qanday amalga oshiradi:

Deyarli shunga o'xshash matn Firefox 3 da edi:


Agar siz hamma narsani o'qib chiqsangiz, sayt nima xabar bergani va brauzer nimani xabar qilgani aniq bo'ladi. Biroq, siz hali ham aldashingiz mumkin.


Bu erda biz to'g'ridan-to'g'ri tugmalardagi harakatlarning aniq tavsifini ko'ramiz. Foydalanuvchini qolish uchun “Chet” va “Qolish” tugmasini bosishga ishontirish allaqachon qiyin. Menimcha, yechim ideal va bu mavzuni yopish mumkin. Umuman olganda, siz bilganingizdek, deyarli har qanday dialog oynasidagi yuzsiz OK harakat nomi bilan almashtirilishi kerak (masalan, "Fayllarni o'chirish", "Qidiruv", "Qo'shish", "Faylni ochish" va boshqalar), bu suhbat matni ustidan to‘liq nazoratga ega bo‘lsangiz ham, foydalanuvchi xatolari sonini kamaytiradi.

641509 xatosi bilan drama nima edi? Gap shundaki, Firefox 4 va undan yuqori versiyalarida ushbu tasdiqlash quyidagicha ko'rinadi:


Ko'rib turganingizdek, maxsus matn butunlay yo'qoldi. 4-versiyadan boshlab, veb-sayt foydalanuvchiga qo'shimcha xabar bera olmaydi yoki nima uchun foydalanuvchining ketishini istamasligini tushuntira olmaydi. Aytaylik, agar siz bitta oynada ko'plab hujjatlar bilan ishlash interfeysini joriy qilsangiz va ulardan biri saqlanmasa, qaysi birini aniq ayta olasiz, ammo Firefox-da buni tushunmaysiz. Ehtimol, siz uni saqlashni xohlamaysiz va agar siz xabarni ko'rsangiz, xotirjamlik bilan sahifani tark etasiz, lekin aks holda nima bo'layotganini bilmaysiz. Varaqda

Ushbu darsda biz derazalarni ochish va yopish, deraza yopiq yoki yo'qligini aniqlash, shuningdek uning ichki nomini olish va hokazolarni ta'minlaydigan oyna ob'ektining turli usullari bilan tanishamiz.

Oyna ob'ektining usullari: open() , close() , print() , focus() va blur() .

Ushbu bo'limda biz oyna ob'ektining quyidagi usullarini ko'rib chiqamiz:

  • open() - oynalarni (tablarni) ochish uchun mo'ljallangan;
  • close() - derazalarni yopish uchun mo'ljallangan. Asosan open() usuli yordamida ochilgan oynalarni yopish uchun ishlatiladi;
  • print() - oyna mazmunini chop etish uchun mo'ljallangan;
  • fokus() - fokusni belgilangan oynaga o'tkazish uchun mo'ljallangan;
  • blur() - belgilangan oynadan fokusni olib tashlash uchun mo'ljallangan.
open() usuli. U brauzerda yangi oyna (tab) ochish uchun mo'ljallangan va quyidagi sintaksisga ega:

Usul parametrlari:

  • Birinchi parametr ushbu oynaga yuklanishi kerak bo'lgan sahifaning URL manzilini belgilaydi. Agar ushbu parametrning qiymati ko'rsatilmagan bo'lsa, oynada bo'sh sahifa (haqida: bo'sh) ko'rsatiladi.
  • Ochiq usulning ikkinchi parametri maqsadli atributning qiymatini yoki oyna nomini belgilaydi. Quyidagi qiymatlar qo'llab-quvvatlanadi:
    • _blank - URL yangi oynaga (tab) yuklanadi. Bu standart qiymat;
    • _parent - URL asosiy ramkaga yuklanadi. Agar u yo'q bo'lsa, u holda URL joriy oynaga (tab) yuklanadi;
    • _self - URL joriy oynaga yuklanadi;
    • _top - barcha freymlarni bekor qiladi va URLni joriy brauzer oynasiga (tab) yuklaydi. Agar u yo'q bo'lsa, u holda URL joriy oynaga (tab) yuklanadi;
    • Parametr sifatida ochiladigan oyna nomini ham belgilashingiz mumkin. Bu nom ichki bo'lib, veb-ishlab chiquvchilar tomonidan ushbu oynaning funksiyalari va usullarini chaqirish uchun ishlatilishi mumkin.
  • Uchinchi parametr vergul bilan ajratilgan oyna xususiyatlari to'plamini belgilash uchun mo'ljallangan. Quyidagi asosiy oyna xususiyatlari qo'llab-quvvatlanadi:
    • chap , yuqori - ekranning yuqori chap burchagiga nisbatan brauzer oynasining yuqori chap burchagining koordinatalari (piksellarda). Ushbu xususiyatlarning qiymatlari ijobiy yoki 0 ga teng bo'lishi kerak;
    • balandligi , kengligi - brauzer oynasining ish maydonining balandligi va kengligi. Qiymatlarni belgilashda brauzer oynasining kengligi va balandligi 100 pikseldan kam bo'lmasligini hisobga olish kerak;
    • resizable — mantiqiy oyna xususiyati boʻlib, u brauzer oynasining oʻlchamini oʻzgartirish imkoniyatini yoqish yoki oʻchirish uchun moʻljallangan. Bu xususiyat quyidagi qiymatlarni qabul qiladi: ha yoki 1, va yo'q yoki 0;
    • aylantirish satrlari - bu mantiqiy oyna xususiyati bo'lib, u brauzer oynasi mazmuni uchun aylantirish satrlarini ko'rsatishni yoqish yoki o'chirish uchun ishlatiladi. Bu xususiyat quyidagi qiymatlarni qabul qiladi: ha yoki 1, va yo'q yoki 0;
    • status - brauzer holati panelini ko'rsatishni yoqish yoki o'chirish uchun mo'ljallangan mantiqiy oyna xususiyati. Bu xususiyat quyidagi qiymatlarni qabul qiladi: ha yoki 1, va yo'q yoki 0.

Quyidagi misollarni ko'rib chiqing:

1. Yangi oynada bo'sh about:bo'sh sahifani oching. Ushbu oynaning kengligi va balandligi 250px bo'lishi kerak:

Window.open("","","kenglik=250,balandlik=250");

2. Joriy oynada "http://site/" veb-sahifasini oching:

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

3. Muayyan xususiyatlarga ega yangi oynani oching (yuqori=100, chap=100, kenglik=400, balandlik=500, aylantirish paneli=ha, resizabie=ha):

Window.open("http://site", "_blank", "top=100, chap=100, width=400, balandligi=500, scrollbars=ha, resizable=ha");

Ochilgandan keyin oyna bilan qanday ishlash kerak?

open() usuli nafaqat oynani ochish, balki shu oynaga havola olish imkonini beradi. Ushbu havola sizga ma'lum xususiyatlar va usullarni chaqirish orqali ushbu oyna bilan o'zaro ishlashga imkon beradi. Bular. Biz boshqa oynani boshqarish uchun bir oynada joylashgan JavaScript kodidan foydalanishimiz mumkin.

Masalan, ochiq oynaning hujjat ob'ektiga kirish uchun:

Yangi bo'sh oynani oching va unda bir nechta matnni ko'rsating:

Var myWindow = window.open("", "", "kenglik=250, balandlik=250"); myWindow.document.write("

Ba'zi matn

");

Eslatma: Siz faqat o'zingiz ochgan oynalar bilan ishlashingiz mumkin, boshqa oynalar bilan ishlay olmaysiz.

close() usuli

U oynani yopish uchun mo'ljallangan. Ushbu usul hech qanday parametrga ega emas. Odatda open() usuli bilan yaratilgan oynalarni yopish uchun ishlatiladi. Aks holda, foydalanuvchining o'zi ochgan oynani (tabni) yopishga harakat qilganingizda (JavaScript-dan emas), brauzer xavfsizlik nuqtai nazaridan foydalanuvchidan ushbu amalni bajarishni tasdiqlashni so'raydi.

Masalan, myWindow nomli oynani ochish va yopish tugmalarini yaratamiz:

//ochiq oynaning oyna obyektiga havolani saqlaydigan o'zgaruvchi yarating var myWindow; funktsiya myWindowOpen ( myWindow = window.open("http://www.yandex.ru", "myWindow", "width=250, height=250"); ) funktsiyasi myWindowClose (if (myWindow) ( myWindow.close()) ; myWindow = null; ) ) Oynani ochish Oynani yopish

print() usuli

U oynaning mazmunini chop etish uchun mo'ljallangan. Ushbu usul hech qanday parametrga ega emas.

myPrint() funksiyasi ( window.print(); ) Sahifani chop etish

fokus() usuli

Belgilangan oynaga e'tibor berish uchun mo'ljallangan. Ushbu usul hech qanday parametrga ega emas.

blur() usuli

Belgilangan oynadan fokusni olib tashlash uchun mo'ljallangan, ya'ni. uni fonga o'tkazadi. Ushbu usul hech qanday parametrga ega emas.

funktsiya myWindowOpen() ( var myWindow = window.open("", "", "width=200,height=100"); ) funktsiya myWindowFocus() ( myWindow.focus(); ) funktsiya myWindowBlur() ( myWindow.blur (; ) Oynani ochish Diqqatni oynaga berish Oynani fonga o'tkazish

Oyna obyektining xossalari: nomi, ochuvchi, yopiq.

Ushbu bo'limda biz oyna ob'ektining quyidagi xususiyatlarini ko'rib chiqamiz:

  • nom - oynaning ichki nomini olish yoki o'rnatish uchun mo'ljallangan;
  • ochuvchi - joriy oynada ushbu oyna ochilgan oynaga (oyna ob'ektiga) havolani olish imkonini beradi;
  • yopiq - bu qaytariladigan mantiqiy xususiyat: agar oyna yopiq bo'lsa true, agar oyna ochiq bo'lsa, noto'g'ri.
nom xususiyati

Bu xususiyat juda tez-tez ochiq oynaning ichki nomini o'zgartirish uchun ishlatiladi. Bundan tashqari, name xususiyati oynaning ichki nomining joriy qiymatini qaytarishi mumkin.

Oynaning ichki nomi ochilish va yopilish sarlavhalari teglari orasiga o'ralgan satr emas - bu dasturchi uchun mo'ljallangan oynaning nomi. Bular. bu nom foydalanuvchiga ko'rinmaydi.

Bu nom, birinchi navbatda, sahifani ochish kerak bo'lgan oynani ko'rsatish uchun giperhavolalar va shakllarda qo'llaniladi. Masalan, giperhavolada oynaning ichki nomini ko'rsatish uchun maqsad atributidan foydalaniladi.Agar element a target="searchWindow" atributiga ega bo'lsa, u holda ushbu havolani bosganingizda brauzer birinchi navbatda oynani topishga harakat qiladi. bunday ichki nom (searchWindow), agar bunday ichki nomga ega oynalar mavjud bo'lmasa, u yangi oyna ochadi va uni searchWindow nomlaydi. Va agar xuddi shu nomdagi oyna mavjud bo'lsa, unda yangi oyna ochilmaydi, lekin sahifa ushbu oynada ko'rsatilgan havola yordamida qayta yuklanadi. Odatiy bo'lib, brauzer oynalarining ichki nomi yo'q.

Masalan, myWindow nomli oynada “http://www.google.com/” sahifasini ochamiz:

window.name = "meningWindow";

Masalan, open() usuli yordamida oynani ochamiz va unda uning nomini ko'rsatamiz:

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

Bu oynaning nomi bor: " + wnd.name + ".");

ochuvchi mulk

Bu xususiyat oynada asl oynaga (oyna ob'ektiga) havolani olish imkonini beradi, ya'ni. oyna ochilgan oynaga.

Masalan, sizda original oyna (1) bor, unda siz boshqa oynani ochish uchun open() usulidan foydalanasiz (2). Ushbu oynada (2) siz oynani (1) olish uchun ochish xususiyatidan foydalanishingiz mumkin.

funktsiya openMyWindow() ( var myWindow=window.open("","","width=200,height=200"); myWindow.document.write("Open oyna (2)"); $(document).ready (function() ( updatefgallowPrompt(true); window.onbeforeunload = WarnUser; ) funktsiyasi WarnUser() ( var allowPrompt = getfgallowPrompt(); if(allowPrompt) ( saveIndexedDataAlert(); return null; ) else ( updatefgallowPrompt(true); voqea); .stopPropagation ) ) saveIndexedDataAlert() funksiyasi (var allowPrompt = getfgallowPrompt(); var lenIndexedDocs = parseInt($("#sortable3 > li").size()) + parseInt($("#sortable3 > ul").size( )); if(allowPrompt && $.trim(lenIndexedDocs) > 0) ( event.returnValue = "Sizning xabaringiz"; } 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"); }!}

Keyinchalik men uchun ishladi;

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

Window.onbeforeunload = function () ( "Siz haqiqatan ham yopishni xohlaysizmi?"; );

Shaklni yuborish hodisasi ishlov beruvchisidagi yuklab olishdan oldin hodisa ishlov beruvchisi bo'lishi mumkin:

JQuery("forma").submit(funksiya() ( jQuery(oyna).unbind("yuklashdan oldin"); ... ));

2

Mening bitta ota-ona sahifam va pastki sahifam bor. bolalar sahifasi yangi varaqda ochildi

Men bolalar yorlig'ini yopganimda bitta ogohlantirish xabarini (bola sahifa yopiladi) ko'rsatmoqchiman.
Yorliq yopilganda yopiq xabarni qanday ko'rsatish mumkin? (Tetiklantiruvchi vaqt emas)

Men OnUnload va onbeforeunload dan foydalandim.
Ikki usul ham sahifani yangilash va yorliqlarni yopishda chaqiriladi.

Window.onunload = funktsiya doUnload(e) ( alert("Bola oyna yopilmoqda..."); )

Window.onbeforeunload = funktsiya doUnload(e) ( alert("Bola oyna yopilyapti..."); )

Men ogohlantirish xabarini ko'rsatishim kerak, shunchaki brauzerdagi yorliqni yoping.

Menga yordam bering. Oldindan raxmat.

Men quyidagi skriptdan foydalanmoqdaman. IE da ishlagan. Lekin FireFoxda ishlamadi

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

Bunga FireFox va boshqa brauzerlarda qanday erishish mumkin.

  • 4 ta javob
  • Tartiblash:

    Faoliyat

1

Buning uchun afaik hech qachon o'zaro faoliyat brauzer stsenariysi bo'lmagan. Yechim muhim narsani aniqlash uchun hujjatsiz va o'zgaruvchan brauzer xususiyatlariga tayanmaslikdir.

Sizda CHILD sahifasi borligi sababli, siz ota-ona (ochuvchi) bo'yicha test o'rnatishingiz mumkin, u oraliqda childWindowHandle.closed xususiyatini tekshiradi va shunga ko'ra ishlaydi.

1

Agar u Crossbrowser-ni yuklab olishdan oldin hodisani yoqishga harakat qilsa, bu deyarli amalga oshiriladi (Operadan tashqari)

Sinab ko'ring( // http://www.opera.com/support/kb/view/827/ opera.setOverrideHistoryNavigationMode("mos"); history.navigationMode = "mos"; )catch(e)() //Bizning qaerda F" Siz ketyapsizmi xabar funksiyasi ReturnMessage() ( "WTF!!!"ni qaytaring; ) //UnBind Function funksiyasi UnBindWindow() ( window.onbeforeunload = null; return true; ) //Biz hujjatga ta'sir qilishni istamaydigan havolalarni bog'lash .getElementById("homebtn").onclick = UnBindWindow; document.getElementById("googlebtn").onclick = UnBindWindow; //Bind Chiqish xabari dialog oynasi.onbeforeunload = ReturnMessage;

0

Siz buni qila olmasligingiz mumkin, bundan mustasno ba'zi cookie-fayllarga asoslangan usullar, ya'ni doimiy bo'lmagan cookie-fayllar sifatida vaqtinchalik yechimlarni ishlab chiqish. Sahifani yangilash, shaklga asoslangan qayta yo'naltirish yoki teskari yo'naltirish yoki brauzerni hodisani o'chirish bilan yopib qo'yishning ikkinchi identifikatsiyasi oddiy va zerikarli emas. Bunga bog'liq bo'lmaslik tavsiya etiladi.

mijoz yorliqni yopishdan oldin siz ba'zi kichik narsalarni qilishingiz mumkin. javascript brauzerni aniqlaydi tabni yopish/brauzerni yopish , lekin agar sizning harakatlaringiz roʻyxati katta boʻlsa va yorliq tugallanmay turib yopilsa, siz ojizsiz. Siz sinab ko'rishingiz mumkin, lekin mening tajribam bunga bog'liq emas. Ha, siz hozirda farqlash, yangilash va yopish mumkin emas. Shuning uchun, bolaning haqiqatan ham yopiq yoki yo'qligini aniqlashning ishonchli usuli yo'q.

Window.addEventListener("beforeunload", funktsiya (e) ( var confirmationMessage = "\o/"; /* Bu yerda kichik harakat kodi bormi */ (e || window.event).returnValue = confirmationMessage; //Gecko + IE tasdiq xabarini qaytarish; //Webkit, Safari, Chrome ));