2015-08-11 4 views
2

Я хочу открыть всплывающее окно, когда пользователь закрывает последнюю вкладку текущего сайта. Проблемы у меня есть то, чтовсплывающее окно javascript перед закрытием текущей вкладки

  • , когда браузер запрашивает у пользователя (onbeforeunload возвращает значение не является нулевым), то всплывающее окно блокируется браузером (см случай 1 ниже)
  • , когда браузер не подскажите ничего пользователю (onbeforeunload ничего не возвращает), то всплывающее окно не открывается вообще, и, казалось, полностью игнорируется браузером (почему?) (см корпус 2 ниже)

случай 1: приглашение и всплывающее окно (код от this answer)

window.onbeforeunload = function (e) { 
    e = e || window.event; 

    window.open('http://localhost', '_blank'); 

    // For IE and Firefox prior to version 4 
    if (e) { 
     e.returnValue = 'Sure?'; 
    } 

    // For Safari 
    return 'Sure?'; 
}; 

Случай 2: нет подсказки, нет всплывающих, закрытие страницы "нормально"

window.onbeforeunload = function (e) { 
    e = e || window.event; 

    window.open('http://localhost', '_blank'); 
}; 
+0

Браузеры блокируют их специально, так как они были чрезмерно использованы дерьмовыми механизмами рекламы или чтобы пользователи фактически не покидали страницы, которые они хотят покинуть. – spectras

ответ

1

От the specification:

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

Задача, в которой выполняется данный алгоритм, в настоящее время обрабатывает поведение активации, которому было доверено событие click.

Закрытие окна не является событием клика.

Задача, в которой алгоритм работает в данный момент работает слушатель событий для доверенного события, тип которого в следующем списке:

unload не в этом списке.

Задача, в которой работает алгоритм, была поставлена ​​в очередь алгоритмом, которому было разрешено отображать всплывающее окно, а цепочка таких алгоритмов начиналась с определенного таймфрейма пользовательского агента.

Например, если пользователь нажал кнопку, может быть приемлемым, чтобы всплывающее окно получилось после этого через 4 секунды, но, вероятно, это было бы неприемлемым для всплывающего окна после этого через 4 часа.

Опять же, нет. Задача не была поставлена ​​в очередь.

Невозможно открыть всплывающее окно в ответ на сообщение пользователя , пытающийся покинуть ваш сайт. Это позволит слишком много вредных поведений (нажмите на это объявление, quit, popup, вы должны нажать на это объявление, loop).

+0

Большое спасибо за это объяснение, основанное на спецификации! – user7890

-1

Вот мой код:

var popWindow = true; 
    window.onbeforeunload = function() { 
     if(popWindow == true) { 
      popWindow = false; 
      return "Sure?"; 
     } 
    } 

http://jsfiddle.net/anam/su8dznoa/

+0

Это не открывает всплывающее окно. – Quentin

+0

Уверен, что это, проверьте мою скрипку. Возможно, вы пропустили это. – anam

+0

Нет, это не так. Скрипка имеет тот же код, и нет ничего об открытии всплывающих окон там вообще. Даже если это не так, ответы должны быть в ответе, а не просто связаны. – Quentin