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

Событие onbeforeunload с энтузиазмом относится к IE9

Вот пример тестового html:

<!DOCTYPE html>
<html>
  <body>
    <a href="javascript:alert('Not going anywhere!');">Go nowhere 1</a>
    <a href="javascript:void(0);" onclick="alert('Not going anywhere!');">Go nowhere 2</a>
    <a href="#" onclick="location.href='http://www.google.com'; return false;">Go somewhere</a>
    <script type="text/javascript">
      window.onbeforeunload = function() { return "Really leave?"; };
    </script>
  </body>
</html>

Это доступно здесь как рабочая страница: timjeanes.com/ie9_onbeforeunload.htm

В Firefox, Chrome и Safari я получаю поведение, которое я хочу. То есть, нажатие любой из первых двух ссылок показывает диалог предупреждения; нажав на третью ссылку (или, в противном случае, навигация), вы увидите "Вы уверены, что хотите покинуть эту страницу?" сообщение.

Однако, в IE9, "Вы уверены, что хотите покинуть эту страницу?" сообщение также показывает, когда вы нажимаете на одну из первых двух ссылок, даже если никакой навигации не происходит - мы просто запускаем некоторый javascript.

Есть ли что-то, что я делаю неправильно? Или есть хороший обходной путь для IE?

Один из вариантов - использовать href= "#" и поместить мой javascript в onclick. Я не заинтересован в этом, так как он занимает верхнюю часть страницы, а моя реальная страница довольно высока.

Я не тестировал в других версиях IE.

4b9b3361

Ответ 1

Это довольно неудачная ошибка. Кажется, вам придется обойти это, и использование метода хеш-ссылок, вероятно, лучший способ. Чтобы не доводить пользователя до верхней части страницы, отмените событие с помощью event.preventDefault() и event.returnValue = false.

function myClickHandler(e) {
    if (e.preventDefault)
        e.preventDefault();
    e.returnValue = false;
    alert("Not going anywhere!");
}

Назовите его следующим образом:

<a href="#" onclick="myClickHandler(event)">Go nowhere 1</a>

Изменить:. Вы можете отменить событие для всех хеш-ссылок на своей странице следующим образом:

var links = document.links;
for (var i = 0; i < links.length; i++) {
    var link = links[i];
    if (link.href == "#") {
        if (link.addEventListener) {
            link.addEventListener("click", cancelEvent, false);
        }
        else if (link.attachEvent) {
            link.attachEvent("onclick", cancelEvent);
        }
    }
}
function cancelEvent(e) {
    e = e || window.event;
    if (e.preventDefault)
        e.preventDefault();
    e.returnValue = false;
}

Или с помощью jQuery, используя только одну строку кода:

$("a[href='#']").click(function (e) { e.preventDefault(); });

Ответ 2

Более простым решением является использование onunload в IE и onbeforeunload в других браузерах.

Ответ 3

#null в href для предотвращения перескакивания страницы, а не только # и script в onclick=""

Ответ 4

Нельзя привязывать событие к клику с помощью href="javascript:...: ниже не хорошо.

<a href="javascript:alert('Not going anywhere!');">Go nowhere 1</a>

Если вы собираетесь использовать onclick и void href, тогда просто верните false в onclick.

<a onclick="alert('Not going anywhere!');return false;">Go nowhere 2</a>

Ответ 5

На самом деле это не ошибка, что "Вы уверены, что хотите покинуть эту страницу?" появляется сообщение, когда вы щелкаете по первым ссылкам; это кажется "особенностью" в IE 9 - Другие причины, по которым мне не нравится IE