выкарыстоўваючы onbeforeunload падзея, змяненне URL на выбар знаходжання на гэтай старонцы

Перапісаўшы пытанне -

I am trying to make a page on which if user leave the page (either to other link/website or closing window/tab) I want to show the onbeforeunload handeler saying we have a great offer for you? and if user choose to leave the page it should do the normal propogation but if he choose to stay on the page I need him to redirect it to offer page redirection is important, no compromise. For testing lets redirect to google.com

Я зрабіў праграму наступным чынам: -

var stayonthis = true;
  var a;
  function load() {
   window.onbeforeunload = function(e) {
        if(stayonthis){
         a = setTimeout('window.location.href="http://google.com";',100);
         stayonthis = false;    
         return "Do you really want to leave now?";
        }
        else {
            clearTimeout(a);
        }

    };
    window.onunload = function(e) {
         clearTimeout(a);
    };
  }
  window.onload = load;

але праблема ў тым, што калі ён націснуць на спасылку yahoo.com і абярыце пакінуць старонку ён не збіраецца Yahoo але Google замест :(

Дапамажы мне !! Загадзя дзякую

here is the fiddle code

here how you can test because onbeforeunload does not work on iframe well

18
у Firefox, вы не можаце ўсталяваць карыстацкае паведамленне для дыялогу obeforeunload
дададзена аўтар A. Wolff, крыніца
@GeorgeCummins Дыялог «пацвярджае навігацыю» вітаецца ў некаторых прыкладаннях. У Google Docs, напрыклад, калі карыстальнік спрабуе перайсці да таго, як аўтаматычнае захаванне можа завяршыцца. Я, напрыклад, аддаю перавагу быць турбавалі ў «Confirm навігацыі» дыялог, чым страціць сваю працу.
дададзена аўтар svidgen, крыніца
@RohitAgrawal Я сапраўды зьбянтэжаны гэтым канкрэтным пытаннем, хоць. Калі карыстальнік вырашае застацца ... навошта пасылаць іх куды-небудзь яшчэ? (Вы не працуеце ў Google, ты ??)
дададзена аўтар svidgen, крыніца
@RohitAgrawal Я сапраўды зьбянтэжаны гэтым канкрэтным пытаннем, хоць. Калі карыстальнік вырашае застацца ... навошта пасылаць іх куды-небудзь яшчэ? (Вы не працуеце ў Google, ты ??)
дададзена аўтар svidgen, крыніца
@GeorgeCummins Дыялог «пацвярджае навігацыю» вітаецца ў некаторых прыкладаннях. У Google Docs, напрыклад, калі карыстальнік спрабуе перайсці да таго, як аўтаматычнае захаванне можа завяршыцца. Я, напрыклад, аддаю перавагу быць турбавалі ў «Confirm навігацыі» дыялог, чым страціць сваю працу.
дададзена аўтар svidgen, крыніца
Карыстальнікі ненавідзяць гэта. Калі яны не хочуць сыходзіць, яны не будуць змяняць URL або зачыніць ўкладку. Чаму вы хочаце, каб раздражняць іх?
дададзена аўтар George Cummins, крыніца
я ведаю, але яго для навучальных мэтаў не для рэальнага праекта, як УБ
дададзена аўтар Rohit Agrawal, крыніца
гэта можа быць любая спасылкай хтосьці з майго сайта або любая старонка прасоўвання, ГЗС можа быць вы хочаце, каб убачыць прапанову, заставацца на старонцы можа ўзяць яго на гэтую старонку прапаноў і пакінуць павінен нармальна працаваць
дададзена аўтар Rohit Agrawal, крыніца
гэта можа быць любая спасылкай хтосьці з майго сайта або любая старонка прасоўвання, ГЗС можа быць вы хочаце, каб убачыць прапанову, заставацца на старонцы можа ўзяць яго на гэтую старонку прапаноў і пакінуць павінен нармальна працаваць
дададзена аўтар Rohit Agrawal, крыніца
@all пытанне абноўлены
дададзена аўтар Rohit Agrawal, крыніца
@all пытанне абноўлены
дададзена аўтар Rohit Agrawal, крыніца
@roasted яго добра са мной, але ўсё астатняе павінна быць зроблена, я не магу стварыць логіку для гэтага
дададзена аўтар Rohit Agrawal, крыніца
@roasted яго добра са мной, але ўсё астатняе павінна быць зроблена, я не магу стварыць логіку для гэтага
дададзена аўтар Rohit Agrawal, крыніца

7 адказы

Гэта рашэнне працуе ва ўсіх выпадках, выкарыстоўваючы кнопку назад браўзэра, усталяваўшы новы URL-адрас у адраснай радку ці выкарыстоўвайце спасылкі. Тое, што я знайшоў, што запуск апрацоўшчыка onbeforeunload не адлюстроўваецца дыялогавае акно, прымацаваную да onbeforeunload апрацоўшчыка. У гэтым выпадку (калі запуск патрабуецца), выкарыстоўвайце акно пацверджання, каб паказаць паведамленне карыстальніка. Гэты спосаб выпрабаваны ў хром/Firefox і IE (ад 7 да 10)

<�Удар> http://jsfiddle.net/W3vUB/4/show </Страйк>

<�Удар> http://jsfiddle.net/W3vUB/4/ </Страйк>

EDIT: set DEMO on codepen, apparently jsFiddle doesn't like this snippet(?!) BTW, using bing.com due to Google not allowing no more content being displayed inside iframe.

http://codepen.io/anon/pen/dYKKbZ

var a, b = false,
    c = "http://bing.com";

function triggerEvent(el, type) {
    if ((el[type] || false) && typeof el[type] == 'function') {
        el[type](el);
    }
}

$(function() {
    $('a:not([href^=#])').on('click', function (e) {
        e.preventDefault();
        if (confirm("Do you really want to leave now?")) c = this.href;


        triggerEvent(window, 'onbeforeunload');

    });
});

window.onbeforeunload = function (e) {
    if (b) return;
    a = setTimeout(function() {
        b = true;
        window.location.href = c;
        c = "http://bing.com";
        console.log(c);
    }, 500);
    return "Do you really want to leave now?";
}
window.onunload = function() {
    clearTimeout(a);
}
8
дададзена
Звярніце ўвагу, што Firefox не паказвае карыстацкае паведамленне для дыялогу onbeforeunload. Ён заўсёды адлюстроўвае паведамленне па змаўчанні.
дададзена аўтар Pavel Strakhov, крыніца
@dirtyhandsphp Я шкадую, я не ўпэўнены, каб зразумець вашыя question§. Ва ўсякім выпадку, замест таго, каб задаваць пытанні ў каментарах, вы павінны апублікаваць новае пытанне аб SO пра меркаваны паводзінах
дададзена аўтар A. Wolff, крыніца
ўсяго толькі некалькі абнаўленняў, каб не парушыць ўнутраную сувязь унутры старонкі
дададзена аўтар A. Wolff, крыніца
дзіўна, таму што ён працуе для мяне. Але што вы маеце на ўвазе: «не працуе». ???
дададзена аўтар A. Wolff, крыніца
см абноўлены адказ і дайце мне ведаць,
дададзена аўтар A. Wolff, крыніца
@Riateche Праўда! OP сказалі, што гэта не было для яго праблемай. См каментары ў пытанні.
дададзена аўтар A. Wolff, крыніца
дададзена аўтар Rohit Agrawal, крыніца
націснуўшы tryit, а затым пакінуць на гэтай старонцы павінен перайсці Yahoo, але яго будзе Google
дададзена аўтар Rohit Agrawal, крыніца
націснуўшы на спасылку не показывает ніякіх папярэджанняў :(
дададзена аўтар Rohit Agrawal, крыніца
не працуе... :(
дададзена аўтар Rohit Agrawal, крыніца
Прывітанне @ A.Wolff: Дзякуй за код. Ці магу я рэалізаваць яго на «Пакіньце старонку» замест кнопкі «Пакінуць Пэйдж»? Якія ўсе змены я павінен рабіць? Вы можаце, калі ласка, кіраўніцтва ..
дададзена аўтар dirtyhandsphp, крыніца
Прывітанне @ A.Wolff: Калі ласка, праверце тут: stackoverflow.com/questions/31239804/…
дададзена аўтар dirtyhandsphp, крыніца
Як я магу выканаць функцыю на кнопку пакінуць старонку кожная рэч усё добра, але як я магу запусціць падзея на кнопку пакінуць старонку
дададзена аўтар Vicky, крыніца

It's better to Check it local.
Check out the comments and try this: LIVE DEMO

var linkClick=false; 
document.onclick = function(e)
{
    linkClick = true;
    var elemntTagName = e.target.tagName;
    if(elemntTagName=='A')
    {
        e.target.getAttribute("href");
        if(!confirm('Are your sure you want to leave?'))
        {
           window.location.href = "http://google.com";
           console.log("http://google.com");
        }
        else
        {
            window.location.href = e.target.getAttribute("href");
            console.log(e.target.getAttribute("href"));
        }
        return false;
    }
}
function OnBeforeUnLoad() 
{
    return "Are you sure?";
    linkClick=false; 
    window.location.href = "http://google.com";
    console.log("http://google.com");
}

І змяніць свой HTML код наступным чынам:

<body onbeforeunload="if(linkClick == false) {return OnBeforeUnLoad()}">
    try it
</body>
2
дададзена
@RohitAgrawal Вы захавалі гэты код у HTML файл і пабег яго лакальным?
дададзена аўтар Siamak A.Motlagh, крыніца
@RohitAgrawal Ці вы праверыць яго ў Firefox? калі вы спрабуеце зачыніць акно і ўхваляю пацвярджаць для закрыцця акна (прыняць прапанову). Вы будзеце перанакіраваны на google.com.
дададзена аўтар Siamak A.Motlagh, крыніца
@RohitAgrawal Праверце адказ зноў лепш у Firefox.
дададзена аўтар Siamak A.Motlagh, крыніца
да я захаваў код і запусціць яго ў мясцовых і чаму гэта не працуе, таму што светлячок Абыякава, т дазваляюць пацвердзіць у выпадку onbeforeunload
дададзена аўтар Rohit Agrawal, крыніца
калі карыстальнік пакіне старонку (альбо іншы спасылкі/сайта або закрыцця акна/ўкладкі), націсніце ня вырашыць маю праблему, прабачце
дададзена аўтар Rohit Agrawal, крыніца
калі я спрабую змяніць URL з дапамогай адраснай радкі або закрыцця акна папярэджання не прыходзіць
дададзена аўтар Rohit Agrawal, крыніца
яго не адчыняючы любы блок пацверджання для мяне ў Firefox
дададзена аўтар Rohit Agrawal, крыніца
дададзена аўтар Rohit Agrawal, крыніца

It's better to Check it local.
Check out the comments and try this: LIVE DEMO

var linkClick=false; 
document.onclick = function(e)
{
    linkClick = true;
    var elemntTagName = e.target.tagName;
    if(elemntTagName=='A')
    {
        e.target.getAttribute("href");
        if(!confirm('Are your sure you want to leave?'))
        {
           window.location.href = "http://google.com";
           console.log("http://google.com");
        }
        else
        {
            window.location.href = e.target.getAttribute("href");
            console.log(e.target.getAttribute("href"));
        }
        return false;
    }
}
function OnBeforeUnLoad() 
{
    return "Are you sure?";
    linkClick=false; 
    window.location.href = "http://google.com";
    console.log("http://google.com");
}

І змяніць свой HTML код наступным чынам:

<body onbeforeunload="if(linkClick == false) {return OnBeforeUnLoad()}">
    try it
</body>
2
дададзена
@RohitAgrawal Вы захавалі гэты код у HTML файл і пабег яго лакальным?
дададзена аўтар Siamak A.Motlagh, крыніца
@RohitAgrawal Ці вы праверыць яго ў Firefox? калі вы спрабуеце зачыніць акно і ўхваляю пацвярджаць для закрыцця акна (прыняць прапанову). Вы будзеце перанакіраваны на google.com.
дададзена аўтар Siamak A.Motlagh, крыніца
@RohitAgrawal Праверце адказ зноў лепш у Firefox.
дададзена аўтар Siamak A.Motlagh, крыніца
калі карыстальнік пакіне старонку (альбо іншы спасылкі/сайта або закрыцця акна/ўкладкі), націсніце ня вырашыць маю праблему, прабачце
дададзена аўтар Rohit Agrawal, крыніца
калі я спрабую змяніць URL з дапамогай адраснай радкі або закрыцця акна папярэджання не прыходзіць
дададзена аўтар Rohit Agrawal, крыніца
яго не адчыняючы любы блок пацверджання для мяне ў Firefox
дададзена аўтар Rohit Agrawal, крыніца
да я захаваў код і запусціць яго ў мясцовых і чаму гэта не працуе, таму што светлячок Абыякава, т дазваляюць пацвердзіць у выпадку onbeforeunload
дададзена аўтар Rohit Agrawal, крыніца
дададзена аўтар Rohit Agrawal, крыніца

Я думаю, што вы збянтэжаныя аб ходзе падзей, на, перш чым выгрузіць старонкі па-ранейшаму узаемадзейнічаючы паміж сабой, метад вяртання, як ярлык для вяртання «Confirm ()», вяртанне пацвярджаюць, аднак, не могуць быць апрацаваны на ўсіх, так што вы не можа рэальна даследаваць рэакцыю карыстальніка і вырашыць, на яго, у які бок ісці, адказ будзе неадкладна ажыццяўляецца як «так» адпачынак старонкі, або «не» не пакідаюць старонкі ...

Звярніце ўвагу на тое, што вы ўжо змянілі крыніца URL у Google перад вамі запытваць карыстальніка, гэта дзеянне не можа быць адменена, калі ... можа быць, вы не можаце setimeout на нешта накшталт 5 секунд (але калі карыстальнік не дастаткова хутка, то не будзе забраць свой адказ)

Змяніць: Я толькі што зрабіў гэта 5000 прамежак часу, і гэта заўсёды ідзе ў Yahoo! Ніколі не ўлоўлівае змена Google на ўсіх.

2
дададзена
Вядома, гэта можа быць зроблена: jsfiddle.net/W3vUB/2/show
дададзена аўтар A. Wolff, крыніца
ўнутраная кропка спасылка сну элемента (Ніз жа старонцы), гэта ўнутраная сувязь з выкарыстаннем хэш-функцыі «#». Гэта як раз там, каб даказаць, што вы ўсё яшчэ можаце выкарыстоўваць унутраныя спасылкі. Калі пстрыкнуць па спасылцы "паспрабаваць гэта вы ўбачыце, што гэта менавіта тое, што OP шукае ...
дададзена аўтар A. Wolff, крыніца
jsfiddle.net/W3vUB/4/show Спадзяюся, што гэта будзе больш лёгка зразумець сучаснасць. ..
дададзена аўтар A. Wolff, крыніца
Добра, я разумею, што лепш вашай ўнутраны канал паводзін :) Thx для ўводу
дададзена аўтар A. Wolff, крыніца
Я не казаў, што не можа быць зроблена ... але ў любым выпадку ваша рашэнне, калі я націскаю Internal, нічога не адбываецца ... другая спасылка простае падзея пстрычкі, які не тое, што гаворка ішла аб.
дададзена аўтар Ayyash, крыніца
Я думаю, што я разумею, мае пераблытаць, я выкарыстоўваю дазвол 1900px, так што ўнутраная сувязь сапраўды, на самай справе нічога не рабіла :) у любым выпадку, што вы зрабілі гэта падзяліць праблему на дзве асобныя часткі і апрацоўваюць спасылку адрозніваецца ад закрыцця браўзэра, які з'яўляецца вельмі разумным , але я думаў, што які пытаецца робіць гэта ў даследчых мэтах, каб убачыць, калі гэта наогул выканальна.
дададзена аўтар Ayyash, крыніца
ттт, калі гаворка ішла аб працы з простым націскам кнопкі, то чаму б выкарыстоўваць «onbeforeunload» наогул? Ваш прыклад сапраўды, сапраўды спарваюцца, нічога не робіць, калі я націскаю ўнутраны.
дададзена аўтар Ayyash, крыніца

Пагуляўшы некаторы час з гэтай праблемай, я зрабіў наступнае. Гэта падобна на працу, але гэта не вельмі надзейныя. Самай вялікай праблемай з'яўляецца тое, што тайм-аўт функцыя павінна пераадолець досыць вялікі адрэзак часу для браўзэра, каб зрабіць падлучэнне да URL у HREF атрыбуту Лінка.

jsfiddle to demonstrate. I used bing.com instead of google.com because of X-Frame-Options: SAMEORIGIN

var F = function(){};//empty function
var offerUrl = 'http://bing.com';
var url;


var handler = function(e) {
    timeout = setTimeout(function() {
        console.log('location.assign');
        location.assign(offerUrl);

    /*
     * This value makes or breaks it.
     * You need enough time so the browser can make the connection to
     * the clicked links href else it will still redirect to the offer url.
     */
    }, 1400);

   //important!
    window.onbeforeunload = F;

    console.info('handler');
    return 'Do you wan\'t to leave now?';
};

window.onbeforeunload = handler;
1
дададзена
Гэта ненадзейны частка :-) Вам прыйдзецца гуляць з таймаўт мілісекунд, каб атрымаць правільны вынік. <�Код> 1400 працаваў для мяне, але, магчыма, вам неабходна ўсталяваць яго на больш высокае значэнне.
дададзена аўтар Bart, крыніца
націснуўшы на паспрабаваць, а затым пакінуць на старонцы ідзе ў bing.com замест yahoo.com
дададзена аўтар Rohit Agrawal, крыніца
Што з таго, што я ўжо зрабіў, я павінен вырашыць, што і для больш высокіх значэнняў, калі абраць, каб застацца на старонцы, яна будзе ісці пазней bing.com
дададзена аўтар Rohit Agrawal, крыніца
<script>
        function endSession() {
           //Browser or Broswer tab is closed
           //Write code here
            alert('Browser or Broswer tab closed');
        }
</script>

<body onpagehide="endSession();">
1
дададзена
Просьба прадставіць тлумачэння не толькі ўзор кода.
дададзена аўтар Raidri, крыніца

Паспрабуйце наступную , (дадае глабальную функцыю, якая правярае стан ўвесь час, хоць).

var redirected=false;
$(window).bind('beforeunload', function(e){
    if(redirected)
        return;
    var orgLoc=window.location.href;
    $(window).bind('focus.unloadev',function(e){
        if(redirected==true)
            return;
        $(window).unbind('focus.unloadev');
        window.setTimeout(function(){
            if(window.location.href!=orgLoc)
                return;
            console.log('redirect...');
            window.location.replace('http://google.com');
        },6000);
        redirected=true;
    });
    console.log('before2'); 
    return "okdoky2";
});

$(window).unload(function(e){console.log('unloading...');redirected=true;});
0
дададзена
калі і павялічыць час шмат, то націснуўшы на паспрабаваць і націсніце на знаходжанне на старонцы будзе ісці да Google праз 10 сек, так што выкарыстоўвайце будзе думаць, што ніякіх дзеянняў для выканання, тая ж праблема, якую я першапачаткова аднясучы да таймеры
дададзена аўтар Rohit Agrawal, крыніца
не мае сэнсу для вырашэння Я шукаю дзякуй
дададзена аўтар Rohit Agrawal, крыніца
усё тая ж памылка я націснуў на гэта паспрабаваць, то пакінуць на гэтай старонцы яна павінна ісці на yahoo.com, але замест таго, каб ісці да google.com
дададзена аўтар Rohit Agrawal, крыніца
працавала тэхніка яго падводзіць, я вам код jsfiddle.net/pb7th/20/show націсніце на паспрабаваць і сказаць, пакінуць на гэтай старонцы прывядзе да google.com замест URL спасылкі :(
дададзена аўтар Rohit Agrawal, крыніца
Фіксаваны, прабачце :)
дададзена аўтар WhyMe, крыніца
Гэта было пытанне часу. Я перапісаў усё гэта .. ў JQuery. Надзея, што дапамагае цяпер ён працуе для мяне кожны раз, калі ... вы можаце змяніць час чакання на працягу 10 секунд, і, верагодна, дазволіць яму быць больш rubust ... jsfiddle.net/pb7th/41
дададзена аўтар WhyMe, крыніца
Вы можаце проста дадаць індыкатар на экране, што будзе казаць «перанакіраваць у ... сек ..» і гэта праўда, у любым выпадку. (Зачыніць і ўсё). Надзея, што дапамагае.
дададзена аўтар WhyMe, крыніца