iframe窃取焦点甚至打开另一个浏览器

时间:2011-11-23 15:22:42

标签: javascript internet-explorer iframe comet

我们有一个网站,我们使用iframe加载一些数据(iframe长轮询)。该数据可以自动加载,例如每2分钟一次。当在IE中打开此网站(在最新的9版本中尝试)时,它将每2分钟发送一次请求。没关系。

但是当我们打开另一个浏览器(或程序)并且IE不在焦点时 - 在每次请求期间,IE都会抓住自己的焦点......

也许有人知道如何解决这个问题(防止IE窃取焦点)? 据我所知,Ajax请求可以解决这个问题,但这可能很难更新......

更新

从服务器(在iframe中)我们返回如下内容:

<html><body>
<script>parent.MailChecker.updateStatus({"s":"Connecting to xxx@gmail.com...","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>

1 个答案:

答案 0 :(得分:0)

从IFRAME技术更改为使用XMLHttpRequest解决方案(由数千个网站/网络应用程序使用)将消除您的焦点问题。许多Comet服务器使用此技术,其中一些列出here

如评论中所述,您应该使用XHR请求(长轮询或流式传输),以便您可以将更新从服务器推送到仅包含数据的客户端。您可以使用XMLHttpRequest(XHR)对象使用HTTP长轮询或HTTP流。从上面你可以看到数据看起来如下:

  

{&#34; s&#34;:&#34;正在连接xxx@gmail.com ......&#34;,&#34; p&#34;:0,&#34; c&#34 ;:空,&#34; E&#34;:假}

之后,当状态改变时,沿着连接推送另一个更新,例如

  

{&#34; s&#34;:&#34;准备提取电子邮件......&#34;,&#34; p&#34;:0,&#34; c&#34;:null &#34; E&#34;:假}

XHR的处理程序然后可以检查XHR.responseText并解析更新值。如果您使用长轮询,这很简单:

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

如果您正在使用XHR流,那么您还需要解析XHR.responseText中的先前更新,因为它的大小不断增长。有关HTTP Streaming的更多信息:http://ajaxpatterns.org/HTTP_Streaming