ссылка mailto (в chrome) вызывает window.onbeforeunload - могу ли я предотвратить это? - PullRequest
16 голосов
/ 16 марта 2012

Возможно связано с Как открыть ссылку mailto в Chrome с Window.open без создания новой вкладки?

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

window.onbeforeunload = function(){
  if(changed)
    return "You have unsaved changes.  Do you really want to leave this page without saving?";
};  

где changed - это переменная, которую я устанавливаю в true всякий раз, когда пользователь вносит какие-либо изменения. Это все хорошо. Тем не менее, я также добавил несколько ссылок mailto на страницу, например:

<a class="button button-alt" href="mailto:foo@foo.com">Report a problem</a>

Несмотря на то, что mailto не перемещается со страницы (оно открывает почтовое приложение пользователя по умолчанию), оно все равно вызывает событие onbeforeunload, вызывая окно подтверждения, что раздражает. Я могу обойти его установкой target="_blank" по ссылке, но тогда пользователь остается сидеть на пустой вкладке.

Могу ли я установить ссылку mailto, чтобы не запускать событие onbeforeunload? Я подумал об ужасно хакерском способе сделать это, имея другую временную переменную javascript, которая заставляет подтверждение onbeforeunload не срабатывать, но это выглядит грязно. Я все равно сделаю это, пока жду ответа, но у кого-нибудь есть более хорошее решение?

спасибо, макс.

Ответы [ 4 ]

18 голосов
/ 12 марта 2015

Очень простое решение этой проблемы - сделать что-то вроде этого:

<a href="mailto:foo@bar.com" target="hidden-iframe">Email me</a>
<iframe name="hidden-iframe" style="visibility:hidden;position:absolute;"></iframe>

(И, конечно же, переместите стили в их собственную таблицу стилей вместо их вставки.)

11 голосов
/ 19 февраля 2015

Используя решение 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;
    };
4 голосов
/ 16 марта 2012

Добавьте флаг и посмотрите, будет ли он перевернут, установите флажок на ссылку click.

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:foo@foo.com" onclick="ignore=true">Report a problem</a>

Было бы лучше добавить onclickс кодом JavaScript.

2 голосов
/ 22 августа 2012

Другой вариант, также немного странный, но немного более общий способ заставить beforeunload игнорировать определенные типы ссылок:

В 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";
}

Редактировать: Почти забыл, этот ответ приходит отсюда: https://stackoverflow.com/a/12065766/421243

...