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/...