仅在查看页面时运行Javascript Ajax调用

时间:2012-02-07 09:46:50

标签: javascript jquery

我在控制器上运行了一个Web应用程序(几乎没有限制的处理,内存和网络带宽)。该页面基本上是一个充满LED的简单HTML文件,应该按间隔更新。在每个时间间隔,Javascript向服务器发送Ajax请求,并根据回复更新所有LED。现在这很好用!

问题是当用户打开其中一个页面并开始浏览其他内容时。出于安全性和经济原因,我们不希望在客户端未看到此页面时更新页面。这是算法:

A flowchart of the page update algorithm

我开发了这个小测试代码,以了解页面事件的工作原理(see live on jsFiddle):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function m(msg){
    document.getElementById("logplace").innerHTML+=msg+"<br/>";
}
</script>
</head>
<body onblur="m('Blur')" onerror="m('Error')" onfocus="m('Focus')" onload="m('Load')" onresize="m('Resize')" onunload="m('Unload')">
<span id="logplace"></span>
</body>
</html>

如果用户当前正在查看,我需要将页面更新。我搜索了Stackoverflow,以下线程似乎不是答案:

PS。 JQuery也存在于服务器上。但如果有一种更简单的方法,我宁愿不使用JQuery。

3 个答案:

答案 0 :(得分:4)

var focused = false;

function onBlur() {
    focused = false;
};
function onFocus(){
    focused = true;
};

if (/*@cc_on!@*/false) { // check for Internet Explorer
document.onfocusin = onFocus;
document.onfocusout = onBlur;
} else {
window.onfocus = onFocus;
window.onblur = onBlur;
}

然后你的javascript可以检查

if (focused)
{
    // process ajax
}

来源:http://www.thefutureoftheweb.com/blog/detect-browser-window-focus

查看他创建的演示,以便您可以看到它的实际效果:http://www.thefutureoftheweb.com/demo/2007-05-16-detect-browser-window-focus/

考虑到这一点,如果您的页面使用间隔计时器进行更新,当窗口失去焦点时,您可以终止间隔,然后在窗口聚焦时再次启动它。

答案 1 :(得分:0)

据我所知,你的数据库中有页面列表。您可以添加名为is_viewed的字段,并在每次用户进入页面时将其更新为+1,每次退出页面时为-1。因此,如果是== 0,您可以执行检查 我没有看到任何其他方式(不是Ajax)来检查另一页上的内容。因此,您无论如何都必须发送请求

答案 2 :(得分:0)

我建议在启动窗口时(只有在可见时才想更新),从主窗口或具有焦点的其他窗口启动它。结合Francis的焦点解决方案和以下技术,您可以从另一个方法访问窗口的DOM。

您可以查看here以获取更多信息。基本上你将使用以下代码

var pageControl=open('page.html','page name','width=200,height=200')

打开页面,并能够使用javascript通过pageControl变量访问它。

它解决了这个问题,它允许您在窗口具有焦点,从其他窗口或主窗口控制更新时更新页面。这里唯一可能的障碍是兼容性。

主窗口解决方案可能涉及更多一点。但如果你是从另一个窗口做到这一点,你可以想象如果你发现没有窗口有焦点那么你就不会激活更新脚本......否则就会解雇它!