Может ли JavaScript определить разницу между выходом через кнопку возврата или ссылкой? - PullRequest
0 голосов
/ 30 июля 2009

В моем приложении есть страницы с несколькими вкладками, которые просто переключают видимый контент. Однако на странице также есть ссылки, которые будут добавлять вкладки на страницу. Кроме того, приложение запоминает (с помощью файлов cookie), какую вкладку вы в последний раз просматривали в случае обновления страницы (строгие настройки кэша вызывают обновление даже при использовании кнопок «назад» и «вперед»).

Моя проблема в том, что при первом посещении этого набора страниц должна отображаться первая вкладка (вкладка A). Затем вы щелкаете ссылку, и она добавляет вкладку и запоминает эту новую вкладку (вкладка B). Однако, если вы нанесли ответный удар, теперь он выглядит так, как будто ничего не сделал, потому что запоминает и отображает вкладку, на которой вы последний раз щелкнули (вкладка B).

Запоминание вкладки B - желательное поведение, если вы нажмете , перешлите на новую страницу и затем воспользуетесь нашей историей в приложении, чтобы вернуться на предыдущую страницу. Однако нежелательно, если вы нажимаете кнопку «Назад», потому что вы хотите, чтобы она снова показывала вкладку А, как это было при первом прибытии.

Мой вопрос заключается в том, может ли событие JavaScript onunload обнаружить разницу между выходом страницы с помощью кнопки «Назад» или каким-либо другим способом. Сейчас я хочу, чтобы он забыл все вкладки, которые он запомнил для этой страницы.

Ответы [ 2 ]

4 голосов
/ 30 июля 2009

Если разница, которую вы пытаетесь обнаружить, заключается в том, что пользователь нажимает на ссылку и уходит со страницы каким-либо другим способом, вы можете обнаружить щелчок по ссылке, используя JavaScript, прикрепив обработчики событий onclick к каждой ссылке, которую хотите просмотреть нажимает на

Таким образом, если onunload срабатывает без первого onclick, пользователь покидает страницу иным способом, чем нажав одну из отслеживаемых ссылок.

<script type="text/javascript">
var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    links[i].onclick = setGlobal;
}
function setGlobal() {
    window.linkClicked = true;
}
window.onunload = function() {
    if (typeof window.linkClicked === 'undefined' || !window.linkClicked) {
        // they are leaving some other way than by clicking a link
    }
}
</script>

Будет немного сложнее, если у вас уже есть onclick события в ваших <a> тегах, если это так, я могу предоставить способ сделать это тоже.

Конечно, вы также можете присоединиться ко всем onclick событиям, используя jQuery или другую библиотеку JavaScript.

0 голосов
/ 30 июля 2009

Браузеры запоминают состояние таймеров (вызовов setTimeout), которые были сделаны на этой странице.

При первой загрузке страницы будет вызван onLoad, установите таймер, который переходит на следующую страницу на основе истории. Если вы уже находитесь на последней странице, нет проблем: D, если нет, то она будет перенаправлена.

Для IE всегда вызывается onLoad, независимо от того, есть ли кнопка «назад», поэтому вы можете поместить туда ту же часть кода.

...