Всплывающее окно заблокировано, окно 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";
            });
        });
    });