`

三个字符导致responseText为“”值

阅读更多
写了一个AJAX sendRequset函数,一直用得很好,突然有一天发现连续调用sendRequest函数后,req.responseText总为“”值
java 代码
 
  1. /** 
  2.  * @author zhongjin.chai 
  3.  */  
  4. var READY_STATE_UNINITIALIZED = 0;  
  5. var READY_STATE_LOADING = 1;  
  6. var READY_STATE_LOADED = 2;  
  7. var READY_STATE_INTERACTIVE = 3;  
  8. var READY_STATE_COMPLETE = 4;  
  9.   
  10. function sendRequest(url, params, HttpMethod, callBack){  
  11.     if(!HttpMethod){  
  12.         HttpMethod = "GET";  
  13.     }  
  14.     var queryStr = "";  
  15.     if(typeof params == 'object'){  
  16.         var querybuff = [];  
  17.         for(key in params){  
  18.             querybuff.push(key+"="+params[key]);  
  19.         }  
  20.         queryStr = querybuff.join('&');  
  21.     }else{  
  22.         queryStr = params;  
  23.     }  
  24.       
  25.     req = initXMLHTTPRequest();  
  26.     if(req){  
  27.         var args=[];  
  28.         for(var i=4;i<arguments.length;i++){  
  29.             args.push(arguments[i]);  
  30.         }  
  31.         req.onreadystatechange = function(){  
  32.             onReadyState.call(this, req, callBack, args);  
  33.         }  
  34.         req.open(HttpMethod, url, true);  
  35.         req.setRequestHeader(  
  36.             "Content-Type""application/x-www-form-urlencoded"  
  37.         );  
  38.         req.setRequestHeader("X-Requested-With""XMLHttpRequest");  
  39.         req.setRequestHeader("Content-length", queryStr.length);  
  40.         req.setRequestHeader("Connection""keep-alive");  
  41.         req.send(queryStr);  
  42.     }  
  43. }  
  44.   
  45. function initXMLHTTPRequest(){  
  46.     var xRequest = null;  
  47.     if(window.XMLHttpRequest){  
  48.         xRequest = new XMLHttpRequest();  
  49.     }else if(window.ActiveXObject){  
  50.         xRequest = new ActiveXObject("Microsoft.XMLHTTP");  
  51.     }  
  52.     return xRequest;  
  53. }  
  54.   
  55. function onReadyState(req, callBack, args){  
  56.     var ready = req.readyState;  
  57.     var data = null;  
  58.     if(ready == READY_STATE_COMPLETE && req.status == 200){  
  59.         data = req.responseText;  
  60.         args.unshift(data);  
  61.         callBack.apply(this, args);  
  62.     }  
  63. }  
这是怎么回事呢?最终发现原来问题出在第25行:
java 代码
  1. req = initXMLHTTPRequest();  

由于,这么写,javascript会默认req为全局变量,所以连续调用sendRequest,后面调用的时候会覆盖req。正确的写法应该是:
java 代码
  1. var req = initXMLHTTPRequest();  
另外,连续调用ajax请求会导致不稳定(在FF里有时候第一次加载页面的时候,连续调用会导致某个请求失败,具体原因还在查),所以尽量不要连着调用。
分享到:
评论
1 楼 afcn0 2007-11-21  
使用var就是把XHR放进闭包当中了,由于每次函数执行都会产生不同的scope当然不会发生冲突了

相关推荐

    Ajax中responseText返回的是一个页面而不是一个值

    然后就去了百度一下,说的是将struts2的返回值设为null(return null),这是因为struts2返回的是一个页面。如果在action中只进行业务逻辑不需要跳转页面的可以将String 类型改为void。这样返回的就不是整个页面了。 ...

    ajax的responseText乱码的问题的解决方法

    关于ajax的responseText乱码的问题这个问题让我和纠结百度了好多都说是javascript的编码问题但是我的 javascript的编码是和myeclipse一样的为什么还会出现问题。最后猜测可能是服务端没有设置返回的字符的 返回类型...

    asp.net ajax操作xmlHttpRequest对象返回的ResponseXML和ResponseText例子

    asp.net ajax操作xmlHttpRequest对象返回的ResponseXML和ResponseText例子

    ajax_读取服务器文件内容.js

    第一个为要读取的文件的地址,第二个是读取成功之后要执行的操作的函数,第三个是读取失败后要执行的操作的函数。 if (oAjax.status == 200)//读取成功 { fnSucc(oAjax.responseText); } else//读取失败 { if...

    jquery-1.1.3 效率提高800%

    如果不是字符串,那么它会被转化为一个查询字符串。在GET请求中它被添加到url的末尾。要防止这种自动转化,请查看processData选项。 数据对象必须是一组键/值对。如果键对应的值是数组,jQuery会将其值赋给同一个键...

    ajax乱码解决汇总

    用AJAX 来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把 resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字...

    Ajax异步请求响应.java

    responseText/responseXML :服务器的响应字符串 status:服务器返回的HTTP状态码 statusText: 服务器返回的HTTP状态信息 readyState :对象状态(0-4) 0 = 未初始化 1 = 正在加载 2 = 已加载 3 = 交互...

    网站心跳监测系统v1.0

    将 if (objXmlHTTP.responseText.IndexOf("您的关键字") ) 中的您的关键字换为需要的字符。这样只有页面包含了某关键字才能认为网站正常。运行时可能会出现无响应的情况,可以不用理会,程序还是在运行中。 开发环境...

    Microsoft ADO Msxml2.ServerXMLHTTP Msxml2.XMLHTTP 程序员参考手册中文版CHM

    responseText 表示一个作为字符串的应答实例,只读。 responseXML 表示一个经MSXML解析过的应答实例,只读。 status 表示当前请求所返回的http状态码,只读。 statusText 表示Http应答行状态,只读。 Methods ...

    asp+ajax静态分页

    if (xmlhttp.readyState==4 && xmlhttp.status==200) { //如果xmlhttp.readyState==4并且xmlhttp.status==200时,执行条件中的程序,其中readyState有五个值,4为请求完成,是客户端向服务器提交的数据成功到达,...

    SQL通过SP_OA调用外部HTTP

    EXEC @HR = sp_OAGetProperty @Object, 'responseText', @response OUT IF @HR &lt;&gt;0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('responseText 0x%x, %s, %s',16,1, @HR, @...

    Ajax Blog 用到的几个函数第1/3页

    ,如果创建失败则返回false 属性:method – 请求方法,字符串,POST或者GET,默认为POST url – 请求URL,字符串,默认为空 async – 是否异步,true为异步,false为同步,默认为true content – 请求的...

    VBA-通过标签获取网页数据.rar

    从本地html文件中提取内容,支持弹框显示选择的HTML页面,获取对应的标签,或者对应的文本,修改下就可以用了

    ajax代理程序,自动判断字符编码

    由于ajax在跨域的访问上有问题,目前最好的方法是做代理.写了个代理程序和心得 为了做ajax的代理,...在服务器端的xmlhttp.Responsebody 这里用的是Responsebody而不是ResponseText或ResponseXml,一开始我是用ResponseTe

    拼写检查插件Mountain-Reviewer.zip

    计划:BookmarkletSafari 插件Chrome 插件VPS 上的 bot,监控特定话题的动态并改正今后更新方向包括但不限于:在西文单词与 CJK 字符之间添加空格,如果原来没有将圆引号替换为方引号改编成基于 Node.js 的机器人,在...

    jquery电子文档chm

    如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。 dataType (String) : 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息...

    JavaScript王者归来part.1 总数2

     6.3.2 函数的所有者--一个为函数指定所有者的例子   6.3.3 动态调用--外来的所有者   6.4 函数常量和闭包   6.4.1 匿名的函数   6.4.2 函数引用   6.4.3 函数参数和函数返回值及其例子   6.4.4 高级...

Global site tag (gtag.js) - Google Analytics