以下代码显示两个按钮: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>
答案 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事件与新窗口相关联并将阻止它。除了要求用户将您的网站标记为安全之外,无法绕过它。
因此,在打开页面之前查看页面是否存在的诀窍是行不通的。您可以尝试执行同步请求,但这可能会导致比阻止的弹出窗口更糟糕的问题。