在FireFox下,使用Ajax提交请求,而该请求是同步时,IE浏览器下正常使用的代码在FireFox下却不执行,主要是不执行onReadyStateChange这个方法体里面的代码,代码如下:
- var xmlhttp = loadXMLDoc();
- var startRequestMethod = function(obj){
- var url = "http://www.xxxx.com?id=1";
- xmlhttp.open("get", url, false); //这是个同步请求
- xmlhttp.send(null);
- xmlhttp.onReadyStateChange = stateChange; //注意这儿
- }
- var stateChange = function(){
- if(xmlhttp.readyState == 4){
- if (xmlhttp.status == 200){
- //需要执行的代码
- }else{
- alert("操作失败!");
- }
- }
- }
- var loadXMLDoc = function(){
- var xmlhttp = null;
- if(window.XMLHttpRequest){
- xmlhttp = new XMLHttpRequest();
- }else if (window.ActiveXObject){
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- return xmlhttp;
- }
查了资料后发现,FireFox3下同步请求不需要等待onReadyStateChange,而直接执行后续代码,于是只要将原先代码中
xmlhttp.onReadyStateChange = stateChange; 这句注掉,然后直接调用stateChange()方法。代码如下:
- var startRequestMethod = function(obj){
- var url = "http://www.xxxx.com?id=1";
- xmlhttp.open("get", url, false); //这是个同步请求
- xmlhttp.send(null);
- //xmlhttp.onReadyStateChange = stateChange; //注意这儿
- stateChange();
- }
综合上面的,可以对同步和异步请求做个判断,做个通用化的处理,代码如下:
- var startRequestMethod = function(obj){
- var url = "http://www.xxxx.com?id=1";
- var ansyType = true; //默认异步
- xmlhttp.open("get", url, ansyType); //这是个同步请求
- xmlhttp.send(null);
- if(ansyType){ //异步
- xmlhttp.onReadyStateChange = stateChange;
- }else{ //同步
- stateChange();
- }
- }
测试环境:IE8+FF3.6.6