Всплывающее окно AJAX заблокировано в IE, но не в FF - PullRequest
0 голосов
/ 06 октября 2009

Следующий код отображает две кнопки: всплывающее окно AJAX и всплывающее окно Direct. Они должны открыть одну и ту же страницу в новом окне. Прямые всплывающие вызовы просто window.open () в событии onclick. Всплывающее окно AJAX выполняет вызов AJAX, а затем в функции stateChanged () точно так же вызывает window.open ().

Они оба работают в FF, но всплывающее окно AJAX не в IE, оно отображает раздражающее всплывающее предупреждение.

Я действительно думаю, что понимаю, что происходит. Блокировщики всплывающих окон обычно допускают одно всплывающее окно за один клик. В этом случае связь между щелчком и всплывающим окном теряется из-за вызова AJAX. Но в моем случае URL для открытия предоставляется серверным компонентом через ответ AJAX. Так что я не могу просто избавиться от вызова AJAX. Я также не могу заставить пользователей использовать FF или изменять свои настройки блокировщика всплывающих окон в IE.

Любые идеи или обходные пути приветствуются.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title> popup test </title>
 <script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url)
{
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp = new XMLHttpRequest();
  }
else if (window.ActiveXObject)
  {
  // code for IE6, IE5
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
else
    {
  alert ("Your browser does not support XMLHTTP!");
  return;
  }
xmlhttp.onreadystatechange=stateChanged;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}

function stateChanged()
{
if (xmlhttp.readyState==4)
  {
  if (xmlhttp.status==200)
    {
        window.open('popup.html', '_blank');
    }
  else
    {
    alert("Problem retrieving XML data:" + xmlhttp.statusText);
    }
  }
}

</script>
 </head>

 <body>
  <button type="button" onclick="loadXMLDoc('popup.html')">AJAX popup</button>
  <button type="button" onclick="window.open('popup.html', '_blank');">Direct popup</button>
 </body>
</html>

Ответы [ 2 ]

2 голосов
/ 06 октября 2009

Как вы предполагаете, это связано с тем, что второй window.open не находится в прямом ответе на действия пользователя.

Один из подходов состоит в том, чтобы открыть окно в обработчике кликов, перед тем как начать вызов Ajax, настроить отображение сообщения «Загрузка ...». Затем, когда URL-адрес получен от вызова Ajax, укажите всплывающему окну, где он должен быть - при условии, что вы делаете:

var popup;

function loadXMLDoc(url) {
    popup = window.open("loading.html");
    // and all the Ajaxy bits after that...
}

тогда все что вам нужно это

function stateChanged() {
    // the readystate stuff...
    var ultimateUrl = /* grab stuff from Ajax response */;
    popup.location.href = ultimateUrl;
}
0 голосов
/ 06 октября 2009

Причина, по которой новое окно задерживается от начального события щелчка. Эта задержка заставляет браузер не связывать событие нажатия с новым окном и блокирует его. Нет другого пути, кроме как попросить пользователя пометить ваш сайт как безопасный.

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

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