需求:php
有一個網頁,網頁上內容較多,網頁動態定義好的一批元素的value對應了一批url,須要根據這批url獲取返回數據,動態刷新當前網頁url各自對應的一個span的顯示值,實時告訴用戶各個url對應的狀態。html
實現思路:web
首先是考慮在頁面加載完成以後自動觸發一個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卻沒問題)url
此問題解決方法是不將xmlhttp.open("GET",jenkinsurl,false);改成 xmlhttp.open("GET",jenkinsurl,true); 此改動能夠解決卡死的問題,可是功能卻受到了影響,最終發現沒法正確的刷新頁面。(全部瀏覽器都不能正常顯示,最終發現是循環執行太快,循環裏使用的動態變量i和最後獲取到響應onreadystatechange裏設計上意圖使用的i的值徹底不同,因此賦值第一次執行的時候,原本覺得是賦值給第一個對象,最終卻發現i已是最後一個對象值+1了。spa
爲解決此問題看了幾篇文章:http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html;http://www.phpv.net/html/1700.html.net
如何動態的,異步的,不影響瀏覽器響應的實時刷新頁面?
此問題解決須要用到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)函數,直到將當前網頁須要賦值的所有賦值。