Раздели на сайта
Избор на редактора:
- Възстановяване на парола в Ask
- Как да включите камерата на лаптоп
- Защо музиката не се възпроизвежда във VKontakte?
- Как да увеличите размера на диск C за сметка на диск D, без да губите данни
- Причини за неизправности на дънната платка Ако чипсетът на дънната платка изгори
- Оригинално име за чат
- Използване на стилове в Excel Как да създадете свой собствен нов стил
- Какви грешки възникват по време на инсталацията?
- Социален статус на човек в обществото
- Пълна интерпретация на грешките
реклама
събитие за затваряне на javascript страница. JavaScript - обект Window: Отваряне и затваряне на Windows |
добър ден Наскоро публикувах статия за това как да го направя, но много поискаха да добавят статия с огледален ефект, така че да се появи прозорец, когато посетител напусне сайта, тоест когато се опита да затвори страницата. Днес ще говорим по тази тема и ще ви покажа проста реализация. Разбира се, дебатът за това дали трябва или не да добавите затварящ изскачащ прозорец към вашия сайт никога няма да спре. Някои казват, че има специално място в ада, запазено за тези, които го добавят, че това е ужасно вбесяващо, че ако съм решил да си тръгна, тогава ще си тръгна и никакви изскачащи прозорци няма да ме спрат, а само ще ме дразнят. Други казват, че тези изскачащи прозорци увеличават реализациите и работят чудесно. Мисля, че си струва да опитате и след това, въз основа на статистиката, да направите конкретни заключения относно вашата ниша и продукт. Как да направите изскачащ прозорец при затваряне на страницаВсъщност, не направих повече шум и просто промених леко предишната статия и добавих няколко реда код на JavaScript. Преди това модален прозорец се появяваше, когато за първи път посетите сайт. Сега ще се показва само при първото посещение на сайта (когато курсорът напусне основната област на сайта и се премести в областта на раздела). Ако потребителят посети сайта отново, този прозорец няма да се покаже. Това се изпълнява по абсолютно същия начин, както в предишната статия, с помощта на бисквитки. Бисквитките се съхраняват 7 дни, можете да посочите произволно количество по ваша преценка. И все пак, ние не прикачваме събитие към щракване върху кръста в раздела, а просто проверяваме позицията на курсора. Ние не блокираме прозореца, бутоните и т.н., не изискваме нищо, а просто показваме прозореца. Както миналия път, ще използваме jQuery плъгин arcticModal, което означава, че свързваме самия jQuery:
И ние свързваме темата на приставката, използвам стандартната, но можете да напишете своя собствена:
Сега, за да работят нашите бисквитки, ще добавим приставката за бисквитки от Yandex:
И свържете скрипта config.js със следното съдържание: $(document).ready(function () ( if (!$.cookie("smartCookies")) ( $(document).mouseleave(function (e) ( function getWindow() ( $(".offer").arcticmodal (( closeOnOverlayClick: true, closeOnEsc: true )); Ако прочетете последната статия, забелязахте, че нищо не се е променило, освен че скриптът във файла config.js се е променил леко. Тоест просто се появи друго условие, което се задейства, когато курсорът напусне областта на сайта, тоест е в областта на разделите. Между другото, последния път забравих да обясня какво означават тези параметри: CloseOnOverlayClick: вярно, closeOnEsc: вярно
Сега за самото оформление на страницата. Абсолютно нищо не се е променило. Вашето предложение, формуляр и т.н. ще бъдат тук. Можете да вмъкнете формуляр или да предложите да ви следват в социалните мрежи Ще обясня малко. modalInner е модална обвивка на прозорец с display:none в стиловете. оферта е класът на самия модален прозорец. Ако го промените, не забравяйте да промените класа в скрипта. Ето една проста реализация на изскачащ прозорец при затваряне на страница. Смятате ли, че си струва да използвате подобен ефект на уебсайт? прозорец js събития (14) Искам да заснема събитието за затваряне на прозорец/раздел на браузъра. Опитах следното с jQuery: JQuery(window).bind("beforeunload", function() ( return confirm("Наистина ли искате да затворите?") )) Но работи и с изпращане на формуляр, което не е това, което искам. Искам събитие, което се задейства само когато потребителят затвори прозореца. От jQuery 1.7 методът .live() е отхвърлен. Използвайте .on(), за да прикачите манипулатори на събития. Потребителите на по-стари версии на jQuery трябва да използват .delegate() вместо .live() $(window).bind("beforeunload", function() ( return true || confirm("Наистина ли искате да затворите?"); )); $(прозорец).unbind(); JQuery(window).bind("beforeunload", function (e) ( var activeElementTagName = e.target.activeElement.tagName; if (activeElementTagName != "A" && activeElementTagName != "INPUT") ( return "Наистина ли искате да затворя?"; ))) Моят отговор е насочен към предоставяне на прости тестове. КАКВижте отговора на @SLaks. $(window).on("beforeunload", function() ( return inFormOrLink ? "Наистина ли искате да затворите?" : null; )) Колко време ще отнеме на браузъра най-накрая да затвори страницата?Всеки път, когато потребителят затвори страницата (бутон x или CTRL + W), браузърът се изпълнява този кодпреди beforeunload , но не за неопределено време. Единственото изключение е прозорецът за потвърждение (връщане „Наистина ли искате да затворите?“), който ще изчака отговора на потребителя. Chrome: 2 секунди. Какво използвахме, за да тестваме това:
Това, което прави, е да изпраща възможно най-много заявки, преди браузърът да завърши своята страница (синхронно). функция request() ( return $.ajax(( type: "GET", url: "http://localhost:3030/" + Date.now(), async: true )).responseText; ) window.onbeforeunload = ( ) => ( while (true) ( request(); ) return null; ) Изход за Chrome: GET /1480451321041 404 0,389 ms - 32 GET /1480451321052 404 0,219 ms - 32 ... GET /hello/1480451322998 404 0,328 ms - 32 1957ms ≈ 2 секунди // приемаме, че е 2 секунди s тъй като заявките могат да отнемат няколко милисекунди да бъдат изпратени. Опитайте и това Window.onbeforeunload = функция () ( if (pasteEditorChange) ( var btn = confirm("Искате ли да запазите промените?"); if(btn === true)( SavetoEdit();//вашето извикване на функция) else ( windowClose();//вашето извикване на функция ) ) else ( windowClose();//вашето извикване на функция ) ); Просто проверете... Функция wopen_close())( var w = window.open($url, "_blank", "width=600, height=400, scrollbars=no, status=no, resizable=no, screenx=0, screeny=0") ; w.onunload = function() ( if (window.closed) ( alert("window closed"); )else( alert("just refreshed"); ) ) ) За съжаление, ще се задейства ли рестартирането, пренасочване нова страницаили събитие за затваряне на браузъра. Алтернативата е да хванете идентификатора, който задейства събитието, и ако е формуляр, не извиквайте никаква функция, а ако не е идентификаторът на формуляра, тогава направете каквото искате, когато страницата се затвори. Не съм сигурен дали това също е възможно директно и е досадно. Има някои малки неща, които можете да направите, преди клиентът да затвори раздела. javascript открива затваряне на раздела на браузъра/затваряне на браузъра, но ако списъкът ви с действия е голям и разделът се затваря, преди да е завършен, вие сте безпомощни. Можете да опитате, но според моя опит не зависи от това. Window.addEventListener("beforeunload", function (e) ( var confirmationMessage = "\o/"; /* Имате ли малък код за действие тук */ (e || window.event).returnValue = confirmationMessage; //Gecko + IE връщане на съобщение за потвърждение; //Webkit, Safari, Chrome )); Ако вашият изглед на формуляр ги изпраща на друга страница (което вярвам, че го прави, т.е. изпълнява се beforeunload), можете да опитате да промените beforeunload на формуляра на извикване на ajax. По този начин те няма да напуснат страницата ви, когато формулярът е beforeunloaded, и можете да използвате обвързванията си beforeunload както желаете. За решение, което работи добре с контроли на трети страни като Telerik (напр. RadComboBox) и DevExpress, които използват тагове за котва по различни причини, помислете за следния код, който е леко подобрена версия на кода desm с по-добър селектор за самата котва обвързване на етикети: Var inFormOrLink; $("a:not(), a").live("click", function() ( inFormOrLink = true; )); $("form").bind("submit", function() ( inFormOrLink = true; )); $(window).bind("beforeunload", function(eventObject) ( var returnValue = undefined; if (! inFormOrLink) ( returnValue = "Наистина ли искате да затворите?)"; } eventObject.returnValue = returnValue; return returnValue; });!} Използвах Slaks, но не работи както е, защото onbeforeunload returnValue се анализира като низ и след това се показва в прозореца за потвърждение на браузъра. Ето как се показва стойността true, например "true". Просто използвам обратна връзка. Ето моят код Var preventUnloadPrompt; var messageBeforeUnload = "моето съобщение тук - Сигурни ли сте, че искате да напуснете тази страница?"; //var redirectAfterPrompt = "http://www.google.co.in"; $("a").live("click", function() ( preventUnloadPrompt = true; )); $("form").live("submit", function() ( preventUnloadPrompt = true; )); $(window).bind("beforeunload", function(e) ( var rval; if(preventUnloadPrompt) ( return; ) else ( //location.replace(redirectAfterPrompt); return messageBeforeUnload; ) return rval; )) Var validNavigation = false; jQuery(документ).готов(функция () ( wireUpEvents(); )); функция endSession() ( // Браузърът или разделът на браузъра е затворен // Направете sth тук ... alert("чао"); ) функция wireUpEvents() ( /* * За списък със събития, които задействат onbeforeunload в IE * проверете http ://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx */ window.onbeforeunload = function () (debugger if (!validNavigation) ( endSession(); ) ) // Прикачете натискане на клавиш за събитие, за да изключите F5 refresh $(document).bind("keypress", function (e) (debugger if (e.keyCode == 116) ( validNavigation = true; ) )); // Прикачете събитието click for all връзки в страницата $("a").bind("click", function () ( debugger validNavigation = true; )); "submit", function () (debugger validNavigation = true; )); // Прикачване на събитието click за всички входове в страницата $("input").bind("click", function () (debugger validNavigation = true; )); )`въведете код тук`"; } 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"); }!} Моят проблем: Събитието "onbeforeunload" ще бъде задействано само ако е имало нечетен брой изпращания (щраквания). Имах комбинация от решения от подобни теми на SO, за да накарам решението си да работи. добре, моят код ще говори. $(document).ready(function() ( updatefgallowPrompt(true); window.onbeforeunload = WarnUser; ) function WarnUser() ( var allowPrompt = getfgallowPrompt(); if(allowPrompt) ( saveIndexedDataAlert(); return null; ) else ( updatefgallowPrompt(true); event.stopPropagation ) функция saveIndexedDataAlert() ( var allowPrompt = getfgallowPrompt(); var lenIndexedDocs = parseInt($("#sortable3 > li").size()) + parseInt($("#sortable3 > ul").size()); if(allowPrompt && $.trim(lenIndexedDocs) > 0) ( event.returnValue = "Вашето съобщение< 0) { //do whatever you want when closing the window.. } }); След това работи за мен; $(window).unload(function(event) ( if(event.clientY Window.onbeforeunload = function () ( return "Наистина ли искате да затворите?"; ); Може би просто манипулатор на събития beforeunload в манипулатора на събития за изпращане на формуляра: Тогава браузърите станаха по-мъдри и започнаха да добавят помощен текст, за да направят по-трудно измамването на потребителя. Например, ето как го прави IE8: Почти подобен текст беше във Firefox 3:
Каква беше драмата с грешка 641509? Факт е, че това потвърждение във Firefox 4 и по-нова версия изглежда така: Вече няколко пъти ме питаха как да се справя със затварянето на раздел. Да приемем, че потребител иска да затвори вашия сайт и вие правите някакъв изскачащ прозорец и питате: " сигурен ли си", или пренасочване към друг сайт. Разбира се, тези методи са много досадни за потребителите, така че препоръчвам да не ги използвате. За щастие, браузърите също се справят с това много зле, но все пак има някои възможности за обработка на затварянето на раздели. Възможно е да попитате потребителя: " Сигурен ли е, че иска да затвори страницата?". Ето как можете да приложите тази обработка на затваряне на раздел:
Този код ще работи във Firefox, IE, Chrome, но няма да работи в Opera (този браузър изобщо не обработва onbeforeunload). В този случай самата функция за обработка може да върне само низ, тоест никакви пренасочвания няма да работят там. Върнатият низ ще се покаже в прозореца за потвърждение в Chrome и IE. Този ред не се показва във Firefox. 2
Имам една родителска страница и дъщерна страница. дъщерната страница се отвори в нов раздел Искам да показвам едно предупредително съобщение (дъщерната страница се затваря), когато затворя дъщерния раздел. Използвах OnUnload и onbeforeunload. Window.onunload = функция doUnload(e) ( alert("Дете прозорец се затваря..."); ) Window.onbeforeunload = функция doUnload(e) ( alert("Дете прозорец се затваря..."); ) Трябва да покажа предупредителното съобщение, просто затворете раздела в браузъра. помогни ми Благодаря предварително Използвам следния скрипт. Работеше в IE. Но не работи във FireFox window.onbeforeunload = function() ( if ((window.event.clientX< 0) || (window.event.clientY < 0) || (window.event.clientX < -80)) { alert("Child window is closing..."); } }; Как да постигнете това във FireFox и друг браузър.
Сортиране: активност 1
За този afaik никога не е бил сценарий за кръстосани браузъри. Решението е да НЕ разчитате на недокументирани и променливи функции, специфични за браузъра, за да откриете нещо важно. Тъй като имате страница CHILD, можете да настроите тест на родителя (opener), който проверява свойството childWindowHandle.closed на интервали и действа спрямо това. 1
Ако приемем, че просто се опитва да задейства събитието beforeunload Crossbrowser, това почти го прави (освен в Opera) Try( // http://www.opera.com/support/kb/view/827/ opera.setOverrideHistoryNavigationMode("compatible"); history.navigationMode = "compatible"; )catch(e)() //Our Where The F" Are You Going Message function ReturnMessage() ( return "WTF!!!"; ) //UnBind Function function UnBindWindow() ( window.onbeforeunload = null; return true; ) //Bind Връзки, които не искаме да засягаме документа .getElementById("homebtn").onclick = UnBindWindow; document.getElementById("googlebtn").onclick = UnBindWindow; //Bind Exit Message Dialogue.onbeforeunload = ReturnMessage; 0
Може да не сте в състояние да направите това, с изключение на някои методи, базирани на бисквитки, което е заобиколно решение за разработка, тъй като не е постоянно бисквитки. Второто идентифициране на опресняване на страницата, пренасочване на базата на формуляр или обратно пренасочване или затваряне на браузъра с изхвърляне на събития не е лесно и досадно. Препоръчайте да не разчитате на това. можете да направите някои малки неща, преди клиентът да затвори раздела. javascript открива браузър затваряне на раздела/затваряне на браузъра, но ако вашият списък с действия е голям и разделът се затваря, преди да е завършен, вие сте безпомощни. Можете да опитате, но според моя опит не зависи от това. Да, не можете да разграничите обратно, актуализиране и затваряне в този момент. Следователно няма надежден начин да се разбере дали едно дете е наистина затворено. Window.addEventListener("beforeunload", function (e) ( var confirmationMessage = "\o/"; /* Имате ли малък код за действие тук */ (e || window.event).returnValue = confirmationMessage; //Gecko + IE връщане на съобщение за потвърждение; //Webkit, Safari, Chrome )); |
Прочетете: |
---|
Нов
- Как да включите камерата на лаптоп
- Защо музиката не се възпроизвежда във VKontakte?
- Как да увеличите размера на диск C за сметка на диск D, без да губите данни
- Причини за неизправности на дънната платка Ако чипсетът на дънната платка изгори
- Оригинално име за чат
- Използване на стилове в Excel Как да създадете свой собствен нов стил
- Какви грешки възникват по време на инсталацията?
- Социален статус на човек в обществото
- Пълна интерпретация на грешките
- Как да се обадите директно на „жив“ оператор на Beeline: безплатни телефонни номера