Как я могу предотвратить запуск 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>
Мне интересно, есть ли способ обойти это, так как я не хочу, чтобы пользователь думал, что они покидают страницу, когда они просто нажимают на нее кнопку. У меня нет возможности переписывать все различные ссылки, поскольку они встроены и многочисленны.
Любые идеи?
Ответы
Ответ 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 не будет работать в этом редком случае.