需求:
有一个网页,网页上内容较多,网页动态定义好的一批元素的value对应了一批url,需要根据这批url获取返回数据,动态刷新当前网页url各自对应的一个span的显示值,实时告诉用户各个url对应的状态。
实现思路:
首先是考虑在页面加载完成之后自动触发一个js方法,在js方法里动态获取这批url的值,使用xmlhttprequest对象发送请求,获取response之后再赋值给span对象显示。
遇到的问题:
url和js所在网页不同域,无法获取到。
此问题后来通过服务端增加一个网页(例如 1.php)来解决,此网页做中转,js中xmlhttprequest对象发送请求到此网页,将url做参数传入,此网页获取到url参数值则去访问对应url,并获取到返回值,将此返回值在当前网页显示,则js中可以获取到此返回值。
js中可以循环从当前页面获取到url并发送到1.php,但是在循环里通过xmlhttp对象获取response的时候会卡死,也就是onreadystatechange这方法并没有实时异步的处理,体现在网页上就是开始执行js方法之后就卡死了页面,无法响应其他处理。(Chrome/IE均有这个问题,Firefox却没问题)
此问题解决方法是不将xmlhttp.open("GET",jenkinsurl,false);改为 xmlhttp.open("GET",jenkinsurl,true); 此改动可以解决卡死的问题,但是功能却受到了影响,最终发现无法正确的刷新页面。(所有浏览器都不能正常显示,最终发现是循环执行太快,循环里使用的动态变量i和最后获取到响应onreadystatechange里设计上意图使用的i的值完全不一样,所以赋值第一次执行的时候,本来以为是赋值给第一个对象,最终却发现i已经是最后一个对象值+1了。
为解决此问题看了几篇文章:http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html;http://www.phpv.net/html/1700.html
如何动态的,异步的,不影响浏览器响应的实时刷新页面?
此问题解决需要用到setTimeout方法。将创建xmlhttprequest发送url并获取response结果赋值给网页对象的过程定义成一个函数gethtml(i),传入参数为i,通过这个i可以获取到第i个url和第i个网页需要赋值的对象。然后再定义如下递归函数:
var i=0;
function al()
{
i++;
if(i<document.getElementById("mynum").value+1) setTimeout(function(){gethtml(i);al()},100);
}
在window.onload的时候去调用此al函数,则每隔100毫秒就会执行一次gethtml(i)函数,直到将当前网页需要赋值的全部赋值。