2011-11-23 74 views
0

我們有一個網站,我們使用iframe加載一些數據(iframe長查詢)。這些數據可以自動加載,例如每2分鐘一班。當這個網站在IE中打開時(試用最新的9版本),它會每2分鐘發送一次請求。沒關係。即使打開另一個瀏覽器,Iframe仍然關注

但是,當我們打開另外一個瀏覽器(或程序)和IE沒有焦點 - 每個請求期間,IE會抓住一個重點,本身...

也許有人知道如何解決這一問題(防止IE偷焦點)? 據我瞭解Ajax請求可以解決這個問題,但是這可能是難以更新...

更新:

從服務器(在I幀)我們回到這樣的事情:

<html><body> 
<script>parent.MailChecker.updateStatus({"s":"Connecting to [email protected]","p":0,"c":null,"e":false})</script> 
<script>parent.MailChecker.updateStatus({"s":"Preparing to fetch emails...","p":0,"c":null,"e":false})</script> 
<script>parent.MailChecker.updateStatus({"s":"Downloading 1 email from 35...","p":2.8571428571429,"c":null,"e":"784"})</script> 
<script>parent.MailChecker.updateStatus({"s":"Downloading 2 emails from 35...","p":5.7142857142857,"c":null,"e":"784"})</script> 
... 
<script>parent.MailChecker.updateStatus({"s":"Done!","p":100,"c":"0","e":false})</script> 
</body></html> 
+0

IFRAME(永久幀或長輪詢)是此問題的老解決方案。最常見的解決方案是向我們提供'XMLHttpRequest'對象來實現你想要做的事情。如果採取這種方法,您將看不到相同的焦點問題。 – leggetter

+0

在我的情況下,我返回js(這將自動調用)到框架中,所以我不認爲我可以使用Ajax做類似的事情... – Andron

+0

永遠的框架以你描述的方式工作(他們執行腳本,通常是從IFRAME進入頁面的單個調用),因此您需要重新編寫代碼,以便僅發送連接的數據。也許說明哪些功能應該執行? – leggetter

回答

0

從IFRAME技術更改爲使用XMLHttpRequest解決方案(由數千個網站/網絡應用程序使用)將消除您的焦點問題。這項技術被許多Comet服務器所使用,其中一些已列入here

正如評論中所述,您應該使用XHR請求(長輪詢或流式傳輸),以便您可以將更新從服務器推送到僅包含數據的客戶端。您可以使用HTTP Long-Polling或使用XMLHttpRequest(XHR)對象的HTTP流式傳輸。從上面你可以看到數據如下:

{「s」:「連接到[email protected] ...」,「p」:0,「c」:null,「 e「:false}

然後,當狀態更改沿着連接推動另一更新時,例如

{ 「S」: 「準備獲取郵件...」, 「P」:0, 「C」:空, 「E」:假}

爲XHR處理程序然後可以檢查XHR.responseText並解析出更新值。如果使用的是長輪詢這很簡單,只要:

var update = JSON.parse(xhr.responseText); 
MailChecker.updateStatus(update); 

如果您正在使用XHR流,那麼你還需要從XHR.responseText解析出以前的更新,因爲它一直在不斷擴大規模。有關HTTP流式傳輸的更多信息,請訪問:http://ajaxpatterns.org/HTTP_Streaming

+0

因此,例如在郵件服務器上有100封電子郵件。結果 - 我們會發送100個或更多的Ajax請求來查看進度?現在只有一個請求...這就是爲什麼使用iframe的原因。 – Andron

+1

@Andron - 創建一個**持久**連接。然後,隨着新數據可用(電子郵件處理進度發生變化),您的服務器可以將更新推送到Web瀏覽器。如果需要,您可以一次發送多個更新(可能是更新數組)。問題是,你的'iframe'解決方案引發了一個問題,這可能不是正確的解決方案,使用'XMLHttpRequest'對象可能是最適合你的解決方案。我建議你閱讀[Push Technology](http://en.wikipedia.org/wiki/Push_technology)和[Comet](http://en.wikipedia.org/wiki/Comet_(programming))。 – leggetter

+0

感謝您的回答,但對項目的要求是我們無法安裝任何特別的東西(例如彗星)。那麼你認爲這可以通過'XMLHttpRequest'響應來完成嗎?也許你有一個例子... :) – Andron