Всплывающее окно window.open блокируется во время события клика

Что мне в конечном итоге нужно сделать, это запустить $.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 ответа

Решение

I ran into this problem recently and found this work-around:

1) call window.open как раз перед звонком $.ajax and save window reference:

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

2) on callback set location property of the saved window reference:

newWindow.location = url;

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

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

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

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

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

$("form").submit(function(e){
    e.preventDefault();
    $.ajax({
      async: false,
      url: ...,
      data: ...,
      success: function(results){
          if(results.valid){
              window.open(...);
          }
      }
    });
    return false;
  });
const newWin = window.open(`${BASE_URL}`, 'expampleName')
if (newWin) {
  newWin.onload = () => {
    const currentOpenWindow = newWin
    const href = newWin.location.href
  }
}
Другие вопросы по тегам