锁定老帖子 主题:定时器AJAX请求重帧现象
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-24
最后修改:2011-06-23
目前的代码: var id = 0; window.onload = function() { id = document.getElementById("maxId").value; initXMLRequest(); setInterval("sendHTTPRequest()", 1000); }; var xmlRequest = null; function initXMLRequest() { if (window.ActiveXObject) { xmlRequest = new ActiveXObject("Microsoft.XMLHTTP"); } else { if (window.XMLHttpRequest) { xmlRequest = new XMLHttpRequest(); } } } function sendHTTPRequest() { var url = "decodePass?id=" + id + "&sync=" + sync; if (xmlRequest) { xmlRequest.open("POST", url, true); xmlRequest.onreadystatechange = isDataExists; xmlRequest.setRequestHeader("If-Modified-Since","0"); xmlRequest.send(null); } } function isDataExists() { if (xmlRequest.readyState == 4) { if (xmlRequest.status == 200) { id++; } } } 个人推断: 1、在定时轮询AJAX时,在当前设置的循环时间内,没有请求到所要请求的值,这样会发生AJAX URL 没有改变,所以 下次请求还是上次请求的内容,当好几次都没有请求到数据的时候,这样到最后堆积到一块,就会请求到许多重复数据 想到的解决办法: 1、采用递归方法,在方法里面写定时调用方法,可是这样的话当第一次没有请求到数据时候就不会在请求了, window.onload = function() { sendHTTPRequest(); }; function isDataExists() { if (xmlRequest.readyState == 4) { if (xmlRequest.status == 200) { setInterval("sendHTTPRequest()", 1000); id++; } } } 解决办法: 1、把异步请求改成同步请求 2、把setInterval 改成 setTimeout 改为请求完成停顿一秒再请求 3、锁定窗口请求(没试过) 引用 window.reqstate = false;
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-24
Who还有其他的解决方法,一块探讨下撒!
|
|
返回顶楼 | |
发表时间:2011-05-24
奥义之舞 写道 Who还有其他的解决方法,一块探讨下撒! 可以使用长连接. 这边有个文章你可以看看. http://www.ibm.com/developerworks/cn/web/wa-lo-comet/index.html 或者你可以在论坛搜索一下. |
|
返回顶楼 | |
发表时间:2011-05-24
这个长连接的方式了解过了,想先把这种AJAX方式的解决了,放到上面之后在自己解决
|
|
返回顶楼 | |
发表时间:2011-05-24
winting 写道 奥义之舞 写道 Who还有其他的解决方法,一块探讨下撒!
可以使用长连接. 这边有个文章你可以看看. http://www.ibm.com/developerworks/cn/web/wa-lo-comet/index.html 或者你可以在论坛搜索一下. 而且你说的额长连接, 1、AJAX长轮询这种,IE不支持,主要面向的浏览器就是ie的 2、使用Iframe这种,状态栏一直更新是一,HTTP长连接数要小于3吧、 并且对他的实现没有太好的思路 |
|
返回顶楼 | |
发表时间:2011-05-25
http://www.zeitoun.net/articles/comet_and_php/start
利用 htmlFile 解决IE的状态栏一直更新. |
|
返回顶楼 | |
发表时间:2011-05-25
控制轮询获取的数据,把重复请求获取的数据剔除。不知道行不。
|
|
返回顶楼 | |
发表时间:2011-05-25
setInterval 请求,意味着: 每隔一秒都会发起请求, 如果一个请求还没有完成, 可能有网络延时, setInterval 就会发生同时有多个请求挂着, 改为 setTimeout 请求
function poll_data(){ $.post(url, data, function(){ // 以jquery的 post函数为例 setTimeout( function(){ poll_data() ; // 在请求完成后,再等一秒, 调用自身 }, 1000); }); } |
|
返回顶楼 | |
发表时间:2011-05-25
你可以使用在传参数时加一个随机数
{'a':Math.random()} 我在项目中是这样解决的 也可传new Date() |
|
返回顶楼 | |
发表时间:2011-05-25
winting 写道 http://www.zeitoun.net/articles/comet_and_php/start
利用 htmlFile 解决IE的状态栏一直更新. 恩 好代码 虽然是PHP的 呵呵 |
|
返回顶楼 | |