2009-07-06 4 views
11

Может кто-нибудь помочь, у меня есть jquery и chrome блокирует всплывающее окно, которое я создаю. После некоторого расследования, похоже, проблема связана с window.open в случае успешного вызова ajax. Есть ли способ обойти это? Мой вызов jQuery ajax должен вернуть URL-адрес, который мне нужно открыть, и поэтому я застрял.Всплывающее окно заблокировано, окно jquery window.open: AJAX? outside ok

Если я помещаю 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); 
     } 
    }); 

ответ

7

Просто откройте новое окно успех обратного вызова:

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

+0

Отлично! это работает, спасибо большое! –

+0

Карим, ты только что спас мне день! – jodeci

+3

Какая польза от AJAX (что означает «асинхронный Javascript и Xml»), когда вы не используете его асинхронно? Существует несколько альтернатив, например, использование модального, открытие окна перед запросом, отображение загрузочного текста и перенаправление окна при завершении. Я думаю, что это довольно грязно. – Aidiakapi

2

Firefox блокирует всплывающее окно на основе события, которое вызывает запуск javascript-кода; например, это позволит всплывающее окно открыть, которое было вызвано из onclick, но не из того, которое было вызвано setTimeout. За последние годы он немного усложнился, поскольку рекламодатели пытались обойти блокировщик всплывающих окон Firefox.

1

У вас все еще есть код в событии успеха, но async должен быть ложным.

+0

Блокировка пользовательского интерфейса в большинстве случаев кажется плохим. – wbyoung

7

Ваш код возвращает их в Firefox и хром:

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); 
} 

});

Просто будьте осторожны, что асинхронный: false заставит javascript ждать результата jQuery ajax. Это означает, что он замораживает javascript до тех пор, пока не будет завершен вызов ajax.

+0

Спасибо @CodingWay –

+0

FYI это больше не работает с Chrome версии 30 или IE 10.0.4 – Jazaret

+2

Блокировка пользовательского интерфейса в большинстве случаев кажется плохим. – wbyoung

17

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

window.open("about:blank", "myNewPage"); 

Затем делает Аякс бизнеса и в функции done(), откройте страницу с этим именем.

window.open("/foo.html", "myNewPage"); 

Это также не имеет значения, если вы делаете это асинхронно или нет.

+0

Это работает для меня в последних версиях Safari, Chrome и Firefox. Это должен быть принятый ответ. – wbyoung

+0

[Другой способ, который, кажется, работает хорошо.] (Http://stackoverflow.com/a/16361814/98069) – wbyoung

+0

Все еще работает в последнем Firefox + Chrome. :) – mindore

1

Следовать по методике, описанной в этом посте:

window.open without popup blocker using AJAX and manipulating the window.location

В двух словах, подход:

  1. Ваш код должен быть инициирован с помощью onclick события.
  2. Откройте новое окно, возможно, изначально без содержимого, с window.open --- и сохраните ссылку на окно, чтобы вы могли использовать его позже.
  3. В обратном вызове успеха из вашей операции AJAX используйте window.location.replace для управления URL-адресом вашего уже открытого окна с нужным URL-адресом.
0

если вы поставите асинхронной: правда, то вы должны сделать следующее:

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's ok on safari 
     safariOp.focus(); 
    }, 
    error: function(msg) { 
     //alert(error); 
    } 
}); 
1
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'S OK ON SAFARI 
     } 
    }, 
    error: function(msg) { 
     //alert(error); 
    } 
});