2009-10-06 92 views
0

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

它们都在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> 
+0

这是一个问题,我很也在挣扎。 http://stackoverflow.com/questions/1509306/javascript-window-open-causes-page-close-when-opened-in-ie – Myra 2009-10-06 13:35:10

回答

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

一如既往,它有点复杂。服务器端组件向浏览器组件返回命令,其中一个命令可能是“open url”。但是我事先不知道,“open url”命令将被返回。我可以打开弹出窗口以防万一,但我不确定如果没有“打开网址”命令,我可以将其隐藏起来。如果你在徘徊什么样的晦涩难懂的应用程序 - 这是千叶XForms引擎(http://chiba.sourceforge.net/)。 – Tambet 2009-10-07 08:50:20

相关问题