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

Как я могу предотвратить запуск window.onbeforeunload с помощью javascript: ссылки href в IE?

Я создаю отказоустойчивость для своей формы, которая будет предупреждать пользователей о том, что если они покинут страницу, данные их формы будут потеряны (как и в случае с gmail).

window.onbeforeunload = function () {    
        if (formIsDirty) {
            return "You have unsaved data on this form. Don't leave!";
        }
}

Вышеупомянутая функция отлично работает в firefox, но в IE она запускается любой ссылкой href, даже те, которые являются ссылками на javascript, а не на другие страницы.

например....

<a href='javascript:someFunction();'>click</a>

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

Любые идеи?

4b9b3361

Ответ 1

Вы можете удалить и повторно назначить onbeforeunload при зависании этих ссылок:

jQuery(
  function($)
  {
      //store onbeforeunload for later use
    $(window).data('beforeunload',window.onbeforeunload);  

      //remove||re-assign onbeforeunload on hover 
    $('a[href^="javascript:"]')
      .hover( 
             function(){window.onbeforeunload=null;},
             function(){window.onbeforeunload=$(window).data('beforeunload');}
            );

  }
);

Ответ 2

Я столкнулся с подобной проблемой и нашел очень простое решение:

$("a").mousedown(function() {
    $(window).unbind();
});

Это приведет к удалению события onbeforeunload непосредственно перед запуском события клика.

Ответ 3

Переместите любой script в обработчик событий click, а с резервной страницей для пользователей без JavaScript:

<a href="foo.html" onclick="someFunction(); return false">click</a>

Ненавязчивые чемпионы JS там, вероятно, возражают против использования атрибута onclick, но факт в том, что он работает, это самый простой способ добавить обработчик событий и самый простой способ предоставить пример. Для лучшего разделения проблем вместо этого вы можете использовать свойство DOM0 onclick, addEventListener()/attachEvent() или библиотеку.

Ответ 4

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

<a href="#" onclick='someFunction();'>click</a>

Ive запускает ряд тестов, и это, похоже, выполняет JavaScript без запуска события onbeforeunload. Id будет интересно узнать, работает ли это для других или если у вас все еще есть такая же проблема после реализации тегов таким образом.

Ответ 5

(Как и некоторые другие ответы, это требует изменения способа привязки JavaScript. Если это не работает для вас, не обращайте внимания.)

Я обнаружил, что в IE 7 через IE 10 просто использование jQuery.click() с preventDefault работает без отображения сообщения onbeforeunload (IE 11 не показывает сообщение beforeunload для любого из моих тестовых случаев), Это верно, если href равен '#' или javascript:void(0). Я ожидаю, что вывод будет выполнен, если attachEvent/addEventListener используется напрямую, но я не тестировал это.

Ниже приведена демонстрация http://jsbin.com/tatufehe/1. Обе версии (зеленым) с preventDefault работают (не показывайте диалог beforeunload). Тот, у кого нет preventDefault, показывает это (как сравнение).


$( document ).ready( function () {
  $( 'a' ).click( function ( evt ) {
    $( '#display' ).text( 'You clicked: ' + $( this ).text() );

    if ( $(this).hasClass( 'withPreventDefault' ) ) {
      evt.preventDefault();
    }
  } );
})

window.onbeforeunload = function () {
  return "Are you sure you want to leave?";   
};

<p id="display"></p>

<p><a class="withPreventDefault" href="#">Number sign link *with* preventDefault</a></p>

<p><a class="withPreventDefault" href="javascript:void(0);">JavaScript href link *with* preventDefault</a></p>

<p><a href="javascript:void(0);">JavaScript href link *without* preventDefault</a></p>

Ответ 6

Если пользовательская мышь находится по ссылке, и они запускают страницу обновления с помощью клавиатуры или активируют ссылку с клавиатуры, подсказка не будет отображаться. Таким образом, подход Dr.Molle не будет работать в этом редком случае.