Выводить предупреждение при выходе с сайта, а не только со страницы

Это звучало как что-то почти невозможное, когда оно было представлено мне. Я знаю, что вы можете отобразить диалоговое окно подтверждения при выходе веб-страницы. Но можно ли отобразить диалоговое окно при выходе с сайта?

Я не смог найти / создать ничего, что может прочитать адресную строку и знать, что вы покидаете сайт.

7 ответов


прежде всего определите, какие события могут фактически забрать вашего пользователя с вашего сайта?

  1. щелчок ссылки внутри содержимого вашего веб-сайта
  2. отправить форму на внешнее действие
  3. javascript из дочернего окна, которое изменяет окно.расположение на своем родителе
  4. пользователь начинает поиск в строке поиска (FF и IE)
  5. пользователь вводит поиск / адрес в адресной строке браузера.
  6. пользователь, нажав кнопку Назад (или backspace), когда он только что пришел на ваш сайт
  7. пользователь нажимает кнопку вперед (или shift-backspace), когда они были вне сайта раньше, но вернулись, получив там с помощью функции кнопки Назад
  8. пользователь закрывает окно браузера

так. что ты можешь сделать со всем этим?

  1. это легко. Проверьте якоря, и если они указывают наружу, добавьте некоторые функции в onclick событие
  2. похож на 1. Добавить свой функциональность для onsubmit событие публикации формы за пределами вашего сайта.
  3. -> 8. на самом деле нет применимого решения, которое можно было бы контролировать. Вы можете злоупотреблять onbeforeunload событие столько, сколько вы хотите, но у вас не будет большого успеха, зная, что происходит. И есть определенные ограничения, связанные с onbeforeunload, Так что ваши руки будут связаны большую часть времени.

реальный вопрос?

Почему вы хотите контролировать это событие во всяком случае, за исключением беспокойства ваших пользователей, чтобы не оставлять вас. В любом случае, попрошайничество не дает много справедливости в мире интернета. И когда какой-то сайт будет беспокоить меня сообщениями или даже хуже мешает мне от ухода я бы больше не хотел возвращаться. Он пахнет плохим плохим юзабилити и дает намек на рекламный сайт.

, а старайтесь, чтобы ваши пользователи заинтересованы предоставляя им ценный контент.


ваш лучший выбор-слушать нестандартные beforeunload событие. Это поддерживается почти всеми браузерами, ожидать от Opera, которая, как известно, придерживаться стандартов W3C чрезвычайно строго.

Kickoff пример:

window.onbeforeunload = function() {
    return "You're leaving the site.";
};

это сообщение будет отображаться в виде диалога подтверждения.

в вашем конкретном случае вам нужно отключить его (просто установите значение null) при нажатии на навигационную ссылку или при отправке внутренней формы. Вы можете сделать это, слушаю на click событие желаемых ссылок и submit событие нужных форм. jQuery может быть, здесь очень поможет:

window.onbeforeunload = function() {
    return "You're leaving the site.";
};
$(document).ready(function() {
    $('a[rel!=ext]').click(function() { window.onbeforeunload = null; });
    $('form').submit(function() { window.onbeforeunload = null; });
});

вам нужно только дать всем внешним ссылкам стандартный атрибут defacto rel="ext" чтобы обозначить, что это внешние ссылки.

<a href="http://google.com" rel="ext">Google</a>

это может помочь

  1. нужно проверить onclick событие до присоединения initLocalLinkException();
  2. отказ от ответственности: это не проверял.

HTML-код:

<a href="test.html">internal link</a>
<a href="#test">html anchor</a>
<a href="http://www.google.com">external link</a>
<a href="http://www.google.com" target="_blank">blank external link</a>
<form action="test.html" method="post" >
    <button type="submit">Post Button</button>
</form>

JavaScript:

$(document).ready(function () {
  initLocalLinkException();
  window.onbeforeunload = function () { confirmExit() };
  $('form').submit(function () { 
    window.onbeforeunload = null;
  });
});

function initLocalLinkException() {
  $('a').click(function () {
    if ($(this).attr('target') != '_blank') {

      var link = $(this).attr('href');
      if (link.substr(0, 4) == 'http') { 
        var LocalDomains = new Array('http://www.yourdomain.com', 
                                     'https://yourdomain.com', 
                                     'localhost', '127.0.0.1');
        var matchCount = 0;
        $.each(LocalDomains, function () {
          if (this == link.substr(0, this.length)) {
            matchCount++; 
          }
        });
        if (matchCount == '0') { 
          confirmExit(); 
        } else {
          window.onbeforeunload = null;
        }
      } else { window.onbeforeunload = null;  }

    }
  });
}

function confirmExit() {
  alert('Are you sure?'); // Do whatever u want.
}

посмотри этой теме.

один из возможных способов достичь этого - использовать Javascript для изучения всех a теги на Вашей странице При загрузке и проверьте, связаны ли они с внешним сайтом. Если это так, вы можете добавить onclick событие, чтобы показать окно подтверждения / оповещения или что-то более элегантное. Конечно, использование jQuery значительно упростит Javascript, который вам придется написать, как в приведенном выше потоке.


используя выражение из этот вопрос, вы можете сделать следующее:

$.expr[':'].external = function(obj){
    return !obj.href.match(/^mailto\:/) && (obj.hostname != location.hostname);
};
$.expr[':'].internal = function(obj){
    return obj.hostname == location.hostname;
};

$(function() {
    var unloadMessage = function() {
        return "Don't leave me!";
    };

    $('a:internal').click(function() { 
        window.onbeforeunload = null;
    });
    $('form').submit(function() { 
        window.onbeforeunload = null;
    });

    $('a:external').click(function() { 
        window.onbeforeunload = unloadMessage;
    });

    window.onbeforeunload = unloadMessage;
});

Это возможно. Просто попробуйте ввести вопрос или ответ на SO, а затем уйти, прежде чем отправить его. Не имеет значения, нажимаете ли вы на ссылку или вводите адресную строку, вы получаете "вы уверены?" тревога. Вы можете разместить на так мета спрашивая, как они делают это.


вы можете сделать это, если вы создадите свой сайт как одностраничное веб-приложение.
Это означает, что загружается одна страница, а затем динамически загружается другое содержимое с помощью ajax.

в этом случае onbeforeunload запускается, когда пользователь покидает страницу / сайт.