Javascript AJAX弹出窗口在IE中被阻止,但在FF中未被阻止

Javascript AJAX弹出窗口在IE中被阻止,但在FF中未被阻止,javascript,ajax,internet-explorer,Javascript,Ajax,Internet Explorer,下面的代码显示两个按钮:AJAX弹出和直接弹出。他们应该在新窗口中打开同一页。直接弹出调用onclick事件中的window.open()。AJAX popup执行AJAX调用,然后在stateChanged()函数中以相同的方式调用window.open() 它们都在FF中工作,但AJAX弹出窗口在IE中不工作,它会显示恼人的弹出警告 事实上,我想我明白发生了什么。弹出窗口拦截器通常允许每次单击一次弹出窗口。在这种情况下,单击和弹出之间的关系由于AJAX调用而丢失。但在我的例子中,要打开的ur

下面的代码显示两个按钮:AJAX弹出和直接弹出。他们应该在新窗口中打开同一页。直接弹出调用onclick事件中的window.open()。AJAX popup执行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>

弹出测试
var-xmlhttp;
函数loadXMLDoc(url)
{
if(window.XMLHttpRequest)
{
//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
else if(window.ActiveXObject)
{
//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
其他的
{
警报(“您的浏览器不支持XMLHTTP!”);
返回;
}
onreadystatechange=stateChanged;
open(“GET”,url,true);
xmlhttp.send(空);
}
函数stateChanged()
{
if(xmlhttp.readyState==4)
{
if(xmlhttp.status==200)
{
window.open('popup.html','u blank');
}
其他的
{
警报(“检索XML数据时出现问题:+xmlhttp.statusText”);
}
}
}
AJAX弹出窗口
直接弹出

新窗口从初始单击事件延迟的原因。该延迟会导致浏览器不将单击事件与新窗口关联,并将阻止它。除了要求用户将您的站点标记为安全站点之外,没有其他解决方法


因此,在打开页面之前查看页面是否在那里的技巧将不起作用。您可以尝试执行同步请求,但这可能会导致比阻塞的弹出窗口更严重的问题。

正如您所建议的,这是由于第二个
窗口。open
不是对用户活动的直接响应

一种方法是在开始Ajax调用之前,在click处理程序中打开窗口,设置为显示“Loading…”消息。然后,当从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;
}

这也是我正在努力解决的问题。和往常一样,这有点复杂。服务器端组件将命令返回给浏览器组件,其中一个命令可能是“openurl”。但我事先不知道“openurl”命令是否会返回。我可以打开弹出窗口以防万一,但如果没有“打开url”命令,我不确定是否可以对用户隐藏它。如果您不知道这是一种什么样的模糊应用程序,那么它就是千叶XForms引擎()。