Подтвердить что ты не робот

Используя onbeforeunload event, url change при выборе пребывания на этой странице

Переписывая вопрос -

Я пытаюсь создать страницу, на которой, если пользователь покинет страницу (либо на другую ссылку/веб-сайт, либо на закрытие окна/вкладки), я хочу показать handmer onbeforeunload, говорящий we have a great offer for you?, и если пользователь выбирает leave the page он должен делать обычное протагонирование, но если он выбирает stay on the page, мне нужно, чтобы он перенаправил его на страницу redirection is important, no compromise. Для тестирования можно перенаправить на google.com

Я сделал программу следующим образом:

var stayonthis = true;
  var a;
  function load() {
   window.onbeforeunload = function(e) {
        if(stayonthis){
         a = setTimeout('window.location.href="#" onclick="location.href='http://google.com'; return false;";',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 и выберите leave the page, он не отправится на yahoo, а вместо google: (

Помогите мне! Спасибо в Advance

вот код скрипта

здесь, как вы можете протестировать, потому что onbeforeunload не работает на iframe хорошо

4b9b3361

Ответ 1

Это решение работает во всех случаях, используя обратную кнопку браузера, устанавливая новый URL-адрес в адресной строке или используя ссылки. Я обнаружил, что при запуске onbeforeunload обработчик не показывает диалог, прикрепленный к обработчику onbeforeunload. В этом случае (когда требуется запуск), используйте окно подтверждения, чтобы показать сообщение пользователя. Это обходное решение тестируется в chrome/firefox и IE (от 7 до 10)

http://jsfiddle.net/W3vUB/4/show

http://jsfiddle.net/W3vUB/4/

РЕДАКТИРОВАТЬ: установить DEMO на codepen, видимо, jsFiddle не нравится этот фрагмент (?!) BTW, используя bing.com из-за того, что Google не позволяет больше содержимого отображаться внутри 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);
}

Ответ 2

Лучше проверить его локально. Ознакомьтесь с комментариями и попробуйте следующее: 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()}">
    <a href="http://yahoo.com">try it</a>
</body>

Ответ 3

После игры с этой проблемой я сделал следующее. Кажется, что это работает, но оно не очень надежное. Самая большая проблема заключается в том, что функция, синхронизируемая по времени, должна преодолеть достаточно большой промежуток времени для браузера, чтобы установить соединение с URL-адресом в атрибуте link href.

jsfiddle для демонстрации. Я использовал bing.com вместо google.com из-за 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;

Ответ 4

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

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;});

Ответ 5

<script>
        function endSession() {
            // Browser or Broswer tab is closed
            // Write code here
            alert('Browser or Broswer tab closed');
        }
</script>

<body onpagehide="endSession();">

Ответ 6

Я думаю, что вы запутались в прогрессе событий, прежде чем выгружать страницу, все еще взаимодействует, метод return похож на ярлык для возврата "confirm()", возврат подтверждения, однако, не может быть обработан вообще, поэтому вы не можете действительно расследовать ответ пользователя и решить, в каком направлении идти, ответ будет немедленно выполнен как "да", или "нет" не покидает страницу...

Обратите внимание, что вы уже изменили источник URL-адреса в Google до того, как вы предложили пользователю, это действие не может быть отменено... если, может быть, вы можете установить значение в виде примерно 5 секунд (но тогда, если пользователь не достаточно быстро он не подберет свой ответ)

Изменить: я только что сделал это 5000 раз, и он всегда идет на Yahoo! Никогда не поднимает изменения google вообще.