[原创]同一页面无法多次使用XmlHttp发起Ajax请求的真实原因
小雨 发表于 2008-3-28 13:17:00
/*************
作者:小雨(QQ群群号17639373)
声明:本文完全原创,非商业目的的转载请回复注明转载地址,谢绝商业性质转载
*************/
最近在一项任务中,团队老大要求我使用Ajax避免影响用户体验,于是我开始了Ajax的征程,虽说Ajax本身不难,但是我还是遇到了一些问题:当该页面第一次发出Ajax请求的时候可以正常运行,但是从第二次调用开始我惊奇的发现——onreadystatechange()事件再也没有被调用!
于是我上Google查了一下,发现还有不少人为此感到困扰,而且发现很多人持有的是这个错误的观点:
他们说这是因为一个XmlHttp只能使用一次send(),每次要使用新的XmlHttp。但是我的XmlHttp是函数内的局部变量,函数执行完毕它就会被销毁啊,而且即使我在函数的开头把它赋值null也没有用。
/*然后我发现一个十分有意义的帖子
*/
原来是这个原因,由于IE浏览器有缓存,第一次发送的Ajax请求确实被发送出去了,也接收到了回应,所以就触发了onreadystatechange()事件。但是从第二次起IE浏览器发现缓存里面已经有请求的页面,于是Ajax请求将不再被发送出去,这样当然也不会触发onreadystatechange()事件了。所以只要我们在Url里加上+"&"+Math.random()就可以避免这个问题。当我做了这样修改后果真就可以在同一页面多次使用XmlHttp发起Ajax请求了。接着我把xmlhttp = null删除掉也仍然可以正常运行了。
附代码如下:
<script type="text/javascript">
function createXHR() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    }
    if (window.ActiveXObject) {
        var msxmls = ['MSXML3', 'MSXML2', 'Microsoft']
        for (var i=0; i < msxmls.length; i++) {
            try {
                return new ActiveXObject(msxmls[i]+'.XMLHTTP')
            } catch (e) { }
        }
        throw new Error("No XML component installed!")
    }
}
</script>
<script type="text/javascript">
function refreshComment() {
    var xmlhttp = createXHR();
    var xmlhttpUrl = "flash.aspx?ajax=refresh&"+Math.random();
    xmlhttp.open("GET", xmlhttpUrl, true);
    xmlhttp.send(null);
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
//                alert("xmlhttp.status = " + xmlhttp.status);
//                alert("xmlhttp.readyState = " + xmlhttp.readyState);
               divCommentList.innerHTML=xmlhttp.responseText;
            }
        }
    }
}
</script>

[原创]同一页面无法多次使用XmlHttp发起Ajax请求的真实原因相关推荐

  1. jq中法可以发起ajax请求的方法有,jQuery实现监控页面所有ajax请求的方法

    本文实例讲述了jQuery实现监控页面所有ajax请求的方法.分享给大家供大家参考,具体如下: 你是不是有遇到这样的问题:页面发起两个ajax请求,希望它们都成功以后,再做一个动作? 很容易想到的解决 ...

  2. JQuery发起ajax请求,并在页面动态的添加元素

    页面html代码: <li><div class="coll-tit"><span class="coll-icon">&l ...

  3. ajax出错并返回整个页面html的问题,【提问】ajax请求返回整个html页面

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 后台代码 @SuppressWarnings({ "rawtypes", "unchecked" }) @Requ ...

  4. html页面加载时执行ajax请求,函数在页面加载时发送ajax请求

    我有下面的代码在页面加载运行.我只想在用户完成在文本框中写入时运行它.函数在页面加载时发送ajax请求 代码是: $(document).ready(function() { $("#use ...

  5. (原创)easyui 页面加载慢的原因及解决办法

    Easyui  框架简单.易用,且功能丰富,可以满足大多的管理类网站开发的要求.但越开发到后面的时候, 总感觉页面加载越来越慢,有时打开一个页面需要好几秒甚至十几秒,这种体验是非常糟糕的. 刚开始还以 ...

  6. html 中ajax 请求没反应,ajax请求数据成功,页面的数据没有加载出来

    w3c的ajax的例子,点击按钮,(ajax请求读取一个本地ajax.txt文件)页面展示其内容, 在chrome中打开页面,点击按钮请求成功,但是页面没有显示ajax.txt的内容,这是为什么呢? ...

  7. ajax请求数据渲染个人中心页面

    1. 根据用户请求返回个人中心空模板文件数据 # 获取个人中心数据 @route("/center.html") def center():# 响应状态status = " ...

  8. jquery 同一个页面处理多个ajax请求

    加一个参数 $.post(             "doSysthFile.aspx",             {              type: '1' },      ...

  9. ajax请求的五个步骤_监控整个页面,非AJAX,需要通知

    ajax请求的五个步骤 最近,在JSF中开发新图表和图表"导出服务"时,我遇到了一个非常普遍的问题. 当您执行长时间运行的任务(操作)时,您希望在开始时显示状态"请稍候- ...

最新文章

  1. influxdb java spring_Spring boot使用influxDB总结
  2. ORA-29275:部分多字节字符
  3. 力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法
  4. 写一个公用的gpio口驱动
  5. 腾讯天衍实验室新算法入选国际万维网大会 新冠疫苗AI问答上线
  6. 最新Java校招面试题及答案
  7. 加载本地json文件,并利用批处理调用Chrome显示html
  8. 转 Android中this、super的区别
  9. 本周ASP.NET英文技术文章推荐[07/22 - 07/28]:VS 2008、.NET 3.5、IronRuby、jQuery、ASP.NET AJAX、IIS7...
  10. mysql索引和事务_mysql的索引和事务详细解读
  11. button渐变色 ios_ios文字设置渐变色
  12. otsu算法详细推导、实现及Multi Level OTSU算法实现
  13. 影响世界的77部文学名著
  14. 2014年最新珍藏版XP系统GHO镜像文件下载,史上驱动最齐全XP终结版(定时更新)
  15. 学计算机科学与技术的考研方向,计算机科学与技术考研方向?
  16. Repository模式--采用EF Fluent API使用EntityTypeConfiguration分文件配置Model映射关系
  17. 用matlab绘制P三曲线,科学网—水文频率曲线及MATLAB绘制 - 张凌的博文
  18. linux--常用命令
  19. 微信小程序:enablePullDownRefresh、onReachBottomDistance 、动态设置窗口的背景色、动态设置下拉背景字体
  20. SUSCTF Ez_Pager_Tiper

热门文章

  1. VC6工程目录下的文件说明
  2. Cascade R-CNN的一些记录
  3. js中cookic的存取
  4. 并发编程知识点一张图总结
  5. mybais传入多个参数的方法
  6. Linux学习笔记 -- 文本编辑器之 vi与vim
  7. IIS 发布网站到外网
  8. Lecture 2 Introduction
  9. 使用 WordPress 插件模板开发高质量插件
  10. sphinx在window下和linux下加入开机自启动