Подтвердить что ты не робот

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

В конечном итоге мне нужно выполнить вызов $.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');
    }
  });
}
4b9b3361

Ответ 1

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

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

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

2) в заданном наборе обратных вызовов location свойство сохраненного окна:

newWindow.location = url;

Возможно, это тоже поможет.

Ответ 2

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

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

Ответ 3

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

$("form").submit(function(e){
    e.preventDefault();
    $.ajax({
      async: false,
      url: ...,
      data: ...,
      success: function(results){
          if(results.valid){
              window.open(...);
          }
      }
    });
    return false;
  });

Ответ 4

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