2011-11-23 133 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

相关问题