2012-10-19 81 views
0

我有一個頁面,其中包含一個iframe。在iframe中,默認頁面運行一些JavaScript來打開子窗口,登錄到外部服務,然後在iframe中顯示來自該外部服務的一些內容。Javascript彈出登錄跨瀏覽器問題

我的代碼在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> 

somepage.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試圖延遲執行腳本的某些方面等待別的事情發生但它似乎沒有幫助。

這個代碼是否存在一些跨瀏覽器問題?

由於

回答

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。但是,如果這是您無法控制的第三方網站,則可能是因爲使用了不太理想的解決方案而陷入困境。

+0

YAY!感謝雅各布!外部網站實際上是我控制有限的東西。它現在似乎工作完美無缺。 – Barbs