0

我有一个带有 iframe 的页面。在 iframe 中,默认页面运行一些 javascript 来打开子窗口,登录到外部服务,然后在 iframe 中显示来自该外部服务的一些内容。

我的代码在 Chrome 和 IE 中运行良好,但在 Safari 和 Firefox 中却不行。在这些浏览器中,父窗口似乎忽略了用户现在登录到外部服务并显示他们的“未登录”消息而不是应该显示的信息这一事实。

这是我正在尝试做的代码。

HTML(主页):

<iframe id="brief" name="brief" src="contents/somepage.php?var=WXYZ" width="962" height="600">
<p>Your browser does not support iframes.</p>
</iframe>

某页.php

<html>
<head>
<script type="text/javascript">
window.onload = function()
        {
var code = 'WXYZ';
var login = http://www.externalsite.com/brief/html.asp?/cgi-bin/service?msg=0048&usr=username&pwd=pass';

//OPEN CHILD WINDOW AND LOGIN USING VARIABLES ABOVE, THEN CLOSE WINDOW
childWindow=window.open(login,'','width=30,height=30,location=no');
var cmd = 'childWindow.close()';
setTimeout(cmd,2000);

//REDIRECT THIS IFRAME TO BRIEFING INFORMATION
var uri = 'http://www.externalsite.com/brief/html.asp?/cgi-bin/service?msg=0092&AID=NOSEND&MET=1&NTM=1&LOC='+code;
self.location.href=uri;
}
</script>
</head>

<body>
&nbsp;
</body>
</html>

我尝试调整各种 setTimeout 函数以尝试延迟脚本的某些方面以等待其他事情发生,但这似乎没有帮助。

我缺少的这段代码是否存在一些跨浏览器问题?

谢谢

4

1 回答 1

1

setTimeout(cmd,2000);不会阻止脚本执行两秒钟;相反,它设置了一个将在大约 2 秒内触发的事件。在您调用 之后setTimeout,脚本的其余部分将立即执行:

// This happens right away
uri = 'http://www.externalsite.com/brief/html.asp?/cgi-bin/service?msg=0092&AID=NOSEND&MET=1&NTM=1&LOC='+code;
self.location.href = uri;

它适用于任何浏览器的事实只是幸运的时机。如果您希望 iframe在弹出窗口关闭刷新,请将该代码添加到您的回调中(顺便说一下,您不需要也不应该为计时器处理程序使用字符串):

setTimeout(function() {
    childWindow.close();
    var uri = 'http://www.externalsite.com/brief/html.asp?/cgi-bin/service?msg=0092&AID=NOSEND&MET=1&NTM=1&LOC='+code;
    self.location.href = uri;
}, 2000);

如果弹出窗口的内容在两秒钟内没有加载,即使这个解决方案也不起作用。最好的解决方案是在加载后让弹出窗口自行关闭。然后,您可以检测到它何时关闭并知道您已准备好重新加载 iframe。但是,如果这是一个您无法控制的第三方网站,您可能会陷入使用这种不太理想的解决方案。

于 2012-10-19T01:26:02.863 回答