javascript Page Visibility API

原文链接:http://www.javaarch.net/jiagoushi/661.htm

javascript  Page Visibility API

Page Visibility API是判断页面是否在当前窗口展示,如果显示在当前窗口,则可以选择做或者不做一些事情。

比如我们使用一个AJAX 调用从后台每隔2s查询一些数据

<!DOCTYPE html>
	<html>
		<body>

		<div id="newswell"></div>

		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

		<script>
		var newsDiv;
					
		function getData() {

			$.ajax({url:"news.json"}).done(function(data) {
				newsDiv.innerHTML += "<p><b>Posted at " + new Date() + "
	" + data.message;
				//call it again in 2 seconds
				window.setTimeout(getData, 2000);
			}).fail(function(xhr,status,e) {
				console.dir(e);
			});
		}
			
		$(document).ready(function() {
			newsDiv = document.querySelector("#newswell");
				
			getData();
			
		});
			
		</script>
		</body>
	</html>

如果这个页面不是显示在用户当前可视窗口,比如chrome,不在当前显示的tab页,那么我们可能不需要2s调用,因为那样只会浪费网络请求,查询了数据也没用,用户没有看到。那么我们就可以使用Page Visibility API来判断当前页是否是可视的tab上,如果是我们再去查,不是我们就不查了。Chrome,firefox最新版都支持了,IE也是支持的。

于是我们改为:

<!DOCTYPE html>
	<html>
		<body>

		<div id="newswell"></div>

		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

		<script>
		var newsDiv;
		var active = true;
			
		function isVisible() {
			if("webkitHidden" in document) return !document.webkitHidden;
			if("mozHidden" in document) return !document.mozHidden;
			if("hidden" in document) return !document.hidden;  
			//worse case, just return true
			return true;
		}
			
		function getData() {

			$.ajax({url:"news.json"}).done(function(data) {
				newsDiv.innerHTML += "<p><b>Posted at " + new Date() + "
	" + data.message;
				//call it again in 2 seconds
				if(isVisible()) window.setTimeout(getData, 2000);
				else active = false;
			}).fail(function(xhr,status,e) {
				console.dir(e);
			});
		}
			
		$(document).ready(function() {
			newsDiv = document.querySelector("#newswell");
		
			$(document).bind("visibilitychange webkitvisibilitychange mozvisibilitychange",function(e) {
				console.log("VS CHANGE");
				console.log(isVisible());
				if(isVisible() && !active) {
					active = true;
					getData();
				}
			});
			
			getData();
			
		});
			
		</script>
		</body>
	</html>

demo可以查看http://raymondcamden.com/demos/2013/may/28/crap.html,规范请查看http://www.w3.org/TR/page-visibility/

相关推荐