Mailto link (в chrome) запускает window.onbeforeunload - могу ли я предотвратить это?
Возможно, связано с Как открыть почтовую ссылку в Chrome с помощью Window.open без создания новой вкладки?
Привет всем. У меня есть страница с формой, на которой я установил window.onbeforeunload confirm, чтобы остановить перемещение людей и потерять их изменения случайно:
window.onbeforeunload = function(){
if(changed)
return "You have unsaved changes. Do you really want to leave this page without saving?";
};
где changed
- переменная i, установленная в true, когда пользователь вносит какие-либо изменения. Это все прекрасно. Тем не менее, я также добавил некоторые ссылки mailto на страницу, например:
<a class="button button-alt" href="mailto:[email protected]">Report a problem</a>
Несмотря на то, что mailto не перемещается в сторону от страницы (он открывает почтовое приложение для пользователей по умолчанию), он по-прежнему запускает событие onbeforeunload, запрашивая окно подтверждения, что раздражает. Я могу обойти его, установив target="_blank"
в ссылке, но затем пользователь останется сидящим на пустой вкладке.
Могу ли я установить ссылку mailto, чтобы не запускать событие onbeforeunload? Я подумал об ужасающем хакерском способе сделать это, добавив еще одну временную переменную javascript, которая заставляет подтверждение onbeforeunload не запускаться, но кажется, что это грязно. Я сделаю это в любом случае, пока жду ответа, но у кого-нибудь есть лучшее решение?
спасибо, max
Ответы
Ответ 1
Построение решения epascarello, следующий код JQuery должен сделать трюк:
var ignore_onbeforeunload = false;
$('a[href^=mailto]').on('click',function(){
ignore_onbeforeunload = true;
});
window.onbeforeunload = function() {
if (!ignore_onbeforeunload){
return "Halt! you are not supposed to leave!";
}
ignore_onbeforeunload = false;
};
Ответ 2
На самом деле простое исправление заключается в том, чтобы сделать что-то вроде этого:
<a href="mailto:[email protected]" target="hidden-iframe">Email me</a>
<iframe name="hidden-iframe" style="visibility:hidden;position:absolute;"></iframe>
(И, конечно, переместите стили в свою таблицу стилей, а не вставляйте их.)
Ответ 3
Добавьте флаг и посмотрите, перевернуто ли оно, установите флаг на ссылку нажмите.
var ignore = false
window.onbeforeunload = function() {
if (changed && !ignore) {
return "You have unsaved changes. Do you really want to leave this page without saving?";
} else {
ignore = false;
}
}
И ссылка
<a class="button button-alt" href="mailto:[email protected]" onclick="ignore=true">Report a problem</a>
Было бы лучше добавить onclick с кодом JavaScript.
Ответ 4
Другая опция, также немного хакерская, но немного более общий способ сделать beforeunload игнорировать определенные типы ссылок:
В beforeunload проверьте ссылку, которая вызвала перенагрузку, и если это не ссылка http или https, не беспокойтесь о пользователе.
К сожалению, проверить ссылку, вызвавшую перенагрузку, непросто, поэтому здесь немного взломается обработчик onclick и глобальная переменная.
var lastClicked = null;
window.onclick = function(e){
e = e || window.event;
lastClicked = e.target
}
window.onbeforeunload = function(e){
if (changed && lastClicked && lastClicked.href
&& lastClicked.href.substring(0,4) == 'http')
return "You have unsaved changes";
}
Изменить: почти забыл, этот ответ приходит отсюда: fooobar.com/info/478669/...