AJAX弹出窗口在IE中被阻止,但在FF中没有

时间:2009-10-06 13:24:16

标签: javascript ajax internet-explorer

以下代码显示两个按钮:AJAX弹出窗口和直接弹出窗口。他们应该在新窗口中打开同一页面。直接弹出窗口只调用onclick事件中的window.open()。 AJAX弹出窗口执行AJAX调用,然后在stateChanged()函数中以相同的方式调用window.open()。

它们都在FF中工作,但AJAX弹出窗口不在IE中,它显示恼人的弹出警告。

我实际上认为我理解发生了什么。弹出窗口阻止程序通常允许每次单击一次弹出窗口。在这种情况下,由于AJAX调用,click和popup之间的关系会丢失。但在我的情况下,打开的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 个答案:

答案 0 :(得分:2)

根据您的建议,这是由于第二个window.open未在直接响应用户活动。

一种方法是在单击处理程序中打开窗口,在启动Ajax调用之前,设置为显示“正在加载...”消息。然后,当从Ajax调用接收到URL时,将弹出窗口指向它应该的位置 - 假设您这样做:

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

答案 1 :(得分:0)

原因是新窗口从初始点击事件延迟。该延迟导致浏览器不将click事件与新窗口相关联并将阻止它。除了要求用户将您的网站标记为安全之外,无法绕过它。

因此,在打开页面之前查看页面是否存在的诀窍是行不通的。您可以尝试执行同步请求,但这可能会导致比阻止的弹出窗口更糟糕的问题。