`
angie_hawk7
  • 浏览: 46581 次
  • 性别: Icon_minigender_1
  • 来自: 乌托邦
社区版块
存档分类
最新评论

firefox中的ajax同步传输

阅读更多
firefox中的ajax同步传输
    以前很少使用到ajax同步传输,也没有注意到其在firefox中的表现!前两周因项目需要,使用到了ajax 同步传输,但在测试中发现一般使用的程序firefox中的ajax同步传输无法执行。相同代码,异步状态在firefox下正常,但无法实现需要的功能!

<script language="javascript" type="text/javascript"> 
function GetData() 
{ 
    var result;
    var xmlhttp = create_XML_object();
    xmlhttp.open("POST", "/test.aspx", false);
    xmlhttp.onreadystatechange=function() 
    {
        if (xmlhttp.readyState==4)
        {
            result = xmlhttp.responseText;
        }
    }
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send(null);
    return result;
} 
</script>

    以上基础的ajax调用代码,ajax异步传输在所有浏览器正常,ajax同步传输在IE等其他浏览器中正常,在firefox中的ajax同步传输不会起作用!
    究其原因,就是firefox经常打起的标准大旗(可害苦了不少人),firefox中对ajax同步请求是不调用状态改变函数onreadystatechange的,firefox中的ajax同步传输则在xmlhttp.send(null)之后直接使用xmlhttp.responseText便可获取ajax同步传输返回值!那么我们在JS中就先判断浏览器类型,然后调用不同的代码实现ajax同步传输,代码如下:

<script language="javascript" type="text/javascript">
function getOs()
{
   var OsObject = "";
   if(navigator.userAgent.indexOf("MSIE")>0) {
        return "MSIE";       //IE浏览器
   }
   if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){
        return "Firefox";     //Firefox浏览器
   }
   if(isSafari=navigator.userAgent.indexOf("Safari")>0) {
        return "Safari";      //Safan浏览器
   }
   if(isCamino=navigator.userAgent.indexOf("Camino")>0){
        return "Camino";   //Camino浏览器
   }
   if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){
        return "Gecko";    //Gecko浏览器
   }
}
function GetData()
{ 
    var result;
    var xmlhttp = create_XML_object();
    xmlhttp.open("POST", "/test.aspx", false);
    var btype=getOs();
    if(btype!="Firefox")
    {
        xmlhttp.onreadystatechange=function() 
        {
            if (xmlhttp.readyState==4)
            {
                result = xmlhttp.responseText;
            }
        }
    }
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send(null);
    if(btype=="Firefox")
    {
        result = xmlhttp.responseText;
    }
    return result;
}
</script>

    大功告成,实现在firefox中的ajax同步传输!


==================================================
//new ActiveXObject("Microsoft.XMLHTTP") 这样的ActiveX对象调用的其实是1.0版本(最老的)。
//而更多见的 new ActiveXObject("Msxml2.XMLHTTP") 调用的是2.6或3.0版本(如果客户端装有较新的,则调用的是较新的,查看注册表中 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP\CurVer 项目的值就可以具体知道,如果是3.0版本的话,该值为"Msxml2.XMLHTTP.3.0"。) 
var xmlHttp=false;
try{
	xmlHttp=new ActiveXobject("Msxml2.XMLHTTP");
}catch(e){
	try{
		xmlHttp=new ActiveXobject("Microsoft.XMLHTTP");
	}catch(e2){
		xmlHttp=false;
	}
}


if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
   xmlHttp = new XMLHttpRequest();
}

function onIdcChanged(idcid)
{
var requrl = "${ctx}/block/idc/block.do?method=getRoom&parentInventoryId="+idcid;
xmlHttp.open("POST",requrl, true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.onreadystatechange = update;
xmlHttp.send(null);//为支持火狐加null
}



function update(){

if(xmlHttp.readyState == 4) {
   try{
    var retXml = xmlHttp.responseText;
       //alert(retXml);
       //parase the xml,and then update the related box
    if( retXml == "false" ){
        //can not get the customer info
        alert(retXml);
       }else{
        //get the html element
        var room = document.getElementById("room");
        clearSelect(room,true);
        //get the xml data
     var xmlDoc;
        if (window.ActiveXObject)
        {
               xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
               xmlDoc.async=true;
               xmlDoc.loadXML(retXml);
        }
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation && document.implementation.createDocument)
        {
          var oParser=new DOMParser();
                   xmlDoc=oParser.parseFromString(retXml,"text/xml");

        }
        else
        {
               alert('你的浏览器不支持这个脚本!');
        }
        
           var items = xmlDoc.getElementsByTagName("rooms");
     alert(items[1].getAttribute("name"));
     for(var i=0;i<items.length;i++){
      var id = items[i].getAttribute("id");
      var name = items[i].getAttribute("name");
      room.options.add(new Option(name,id));
     }
    }
   }catch(e){
    //alert(e);
   }
}
}
       

分享到:
评论
1 楼 malson 2012-08-04  
非常感谢,我也遇到这个问题,帮了大忙

相关推荐

Global site tag (gtag.js) - Google Analytics