Всплывающее окно заблокировано, окно jQuery успешно завершено: AJAX? вне ОК
Может кто-нибудь помочь, у меня есть jquery и chrome блокирует всплывающее окно, которое я создаю. После некоторого расследования проблема с window.open
связана с успешным событием вызова ajax. Есть ли способ обойти это? Мой вызов jQuery ajax должен вернуть URL-адрес, который мне нужно открыть, и поэтому я застрял.
Если я помещаю open.window
вне вызова ajax, который он работает, но внутри (успех), он блокируется. Я думаю, что это как-то связано с CONTEXT, но я не уверен...
Любые идеи действительно оценены...
Вот что у меня есть:
window.open("https://www.myurl.com"); // OUTSIDE OF AJAX - no problems
// with popup
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
// Normally loads msg.d that is the url that is returned from service but put static url in for testing
window.open("https://www.myurl.com"); // THIS IS BLOCKED
},
error: function(msg) {
//alert(error);
}
});
Ответы
Ответ 1
Просто откройте новое окно в обратном вызове успеха:
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
window.open("https://www.myurl.com");
},
error: function(msg) {
//alert(error);
}
});
Обратите внимание, что вам может потребоваться установить для параметра $.ajax async значение false, иначе код, следующий за вызовом $.ajax, может быть оценен до получения ответа.
Ответ 2
Как уже отмечалось несколькими людьми, принятый ответ больше не работает. Основываясь на комментарии от aidiakapi, я использовал обходной путь, сначала открыв окно.
window.open("about:blank", "myNewPage");
Затем, выполняя бизнес ajax и в функции done()
, откройте страницу с этим именем.
window.open("/foo.html", "myNewPage");
Это также не имеет значения, если вы делаете это асинхронно или нет.
Ответ 3
Ваш код возвращает их в firefox и chrome:
Firefox: "Firefox не позволил этому сайту открыть всплывающее окно".
Chrome: "Pop-up заблокирован"
Чтобы исправить эту проблему, просто добавьте async: false в ваш вызов ajax.
$.ajax({
type: "POST",
async: false,
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(url) {
window.open(url);
},
error: function(msg) {
//alert(error);
}
});
Просто будьте осторожны, что async: false заставит javascript ждать результата jQuery ajax. Это означает, что он замораживает javascript до тех пор, пока не будет завершен вызов ajax.
Ответ 4
Firefox блокирует всплывающие окна на основе события, которое вызывает запуск javascript-кода; например, он позволит всплывающему окну открыть, который был вызван из onclick
, но не тот, который был вызван setTimeout
. За последние годы он немного усложнился, поскольку рекламодатели пытались обойти блокировщик всплывающих окон firefox.
Ответ 5
У вас все еще может быть код в событии успеха, но async должен быть ложным.
Ответ 6
Следуйте методу, описанному в этом сообщении:
window.open без блокировщика всплывающих окон с использованием AJAX и манипулирования окном .location
В двух словах, подход:
- Ваш код должен быть инициирован событием
onclick
.
- Откройте новое окно, возможно, изначально без содержимого, с помощью
window.open
--- и сохраните ссылку на окно, чтобы впоследствии использовать его.
- В обратном вызове успеха из вашей операции AJAX используйте
window.location.replace
, чтобы манипулировать URL-адресом вашего уже открытого окна с нужным URL-адресом.
Ответ 7
if you put async:true then you must do the following:
var safariOP = window.open("https://www.myurl.com"); // DEFINE BEFORE AJAX CALLBACK
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
if(safariOP){
safariOP.focus(); // IT OK ON SAFARI
}
},
error: function(msg) {
//alert(error);
}
});
Ответ 8
если вы поместите async: true, вы должны сделать следующее:
var safariOp = window.open("https://www.myurl.com"); //define before callback ajax contains url .
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
//it ok on safari
safariOp.focus();
},
error: function(msg) {
//alert(error);
}
});
Ответ 9
это работает для меня.
$(document).ready(function() {
$('#myLink').on( "click", function() {
var myNewTab = window.open('about:blank', '_blank');
$.ajax({
method: "POST",
url: "ajax.php",
data: { name: "John", location: "Boston" },
})
.done(function( msg ) {
myNewTab.location.href = "google.com";
});
});
});