Всплывающее окно 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');
}
});
}
Ответы
Ответ 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 не завершится, чтобы открыть новое окно.