Всплывающее окно window.open блокируется во время события клика - PullRequest
20 голосов
/ 08 июля 2011

В конечном итоге мне нужно выполнить $.ajax() вызов, а затем запустить его и открыть новое окно.

Пользователь нажимает кнопку «Предварительный просмотр», в которой сохраняется текущая форма, а затем открываетсяновое окно, которое показывает предварительный просмотр элемента с данными, которые были только что сохранены.

Но как есть, функция window.open блокируется всплывающими окнами.

Вот основные частимоего кода:

HTML:

<a href="/surveys/185/preview" class="preview" target="_blank">Preview</a>

JavaScript:

$('.preview').live('click', function(event){
  save_survey($(this).attr('href'));
  event.preventDefault();
});

function save_survey(url) {
  $.ajax({
    type: "POST",
    url: form_url,
    dataType: 'json',
    data: form_data,
    success: function(data) {
      window.open(url, '_blank');
    }
  });
}

Ответы [ 4 ]

66 голосов
/ 08 июля 2011

Недавно я столкнулся с этой проблемой и нашел обходной путь:

1) позвоните window.open непосредственно перед вызовом $.ajax и сохраните ссылку на окно:

var newWindow = window.open(...);

2) при установке обратного вызова location свойство сохраненной ссылки на окно:

newWindow.location = url;

Может быть, это вам тоже поможет.

12 голосов
/ 08 июля 2011

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

Если вы используете ajax-запрос для своего события click, запрос запускается асинхронно с событием click, поэтому к тому времени, когда ajax-запрос выполнил свою работу, и вы получите ваше событие с ответом на потерянный запрос ваш шанс вызвать window.open без блокировщика всплывающих окон, исходное событие клика к тому времени уже давно умерло.

3 голосов
/ 08 июля 2011

Согласно этому этому сообщению , похоже, что вам придется открывать свое окно в прямом ответе на щелчок (чтобы избежать попадания блокировщиков всплывающих окон), а не ждать, пока вызов AJAX завершится, чтобы открытьновое окно.

2 голосов
/ 23 апреля 2012

Я решил свой случай, сделав вызов Ajax синхронным.Например (с JQuery):

$("form").submit(function(e){
    e.preventDefault();
    $.ajax({
      async: false,
      url: ...,
      data: ...,
      success: function(results){
          if(results.valid){
              window.open(...);
          }
      }
    });
    return false;
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...