我想在提交数据、并获得responseText的时候,直接让function返回(return)responseText给调用方,但怎么也做不出这种效果。
下面是我写出的代码,在第一个Alert,弹出警告框是正确的ResponseText值,但是在function的结尾,再alert这个var,却又变成了没修改前的值。请问如何才能让子function修改掉父function的变量值?
客户端程序:
- JScript code
<textarea name="xmls" cols="38" rows="12" id="xmls" > <?xml version="1.0" encoding="UTF-8"? > <svc_result ver="1.0.0"> <slia ver="1.0.0"> <action>testing </action> </slia> </svc_result > </textarea > <input value="提交" type="button" onclick="submiter();"/ > <script language="javascript" > //获取表单中的XML文档 //提交给testSSS.asp,同时获取返回值 //再把返回值填写到表单中 function submiter(){ //获取表单中的XML var xml; xml = document.getElementById("xmls").value; //构造url var url; url = "testSSS.asp"; //调用提交函数 //并获取返回的XML sendXML(url,xml); } </script >
--------------------
客户端用到的接口代码:
- JScript code
function sendXML(url,xml){
var subURL;
subURL = url+"?xml="+xml;
var xmlobj;
xmlobj=createxmlhttp();
xmlobj.open("post",subURL, true);
var rsText;
rsText = "Nothing";
xmlobj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlobj.onreadystatechange=function (){
if (xmlobj.readyState==4){
if(xmlobj.status==200){
sendXML.rsText = xmlobj.responseText;
alert(sendXML.rsText);//这里弹出的是responseText值
//rsText = xmlobj.responseText;//这种办法也测试过,效果一样
//alert(rsText);
}
}
};
xmlobj.send(null);
alert(rsText);//这里就变成了修改前的值:“Noting”
return rsText;
}
function createxmlhttp()
{
//create xmlhttp object
xmlhttpobj = false;
try{
xmlhttpobj = new XMLHttpRequest;
}catch(e){
try{
xmlhttpobj=new ActiveXObject("MSXML2.XMLHTTP");
}catch(e2){
try{
xmlhttpobj=new ActiveXObject("Microsoft.XMLHTTP");
}catch(e3){
xmlhttpobj = false;
}
}
}
return xmlhttpobj;
}
-------------------------------------------------
TESSS.asp(服务器端、被请求页面)的代码:
- HTML code
<?xml version="1.0" encoding="UTF-8"? > <svc_result ver="1.0.0" > <slia ver="1.0.0" > <action >back XMLS </action > </slia > </svc_result >
------解决方案--------------------
xmlobj.onreadystatechange是一个属性,指出xmlhttp对象的状态改变时要执行的函数,第一次执行sendXML(url,xml)时,nreadystatechange被赋直后,由于只异步执行,继续执行下去到你的第二个alert(rsText),然后返回return rsText,当然没有取得值.
想达到你的效果,必须让xmlhttp同步执行,就是改xmlobj.open("post",subURL, true); 为xmlobj.open("post",subURL, false); 这样就可以了,但是你应该做一下异常处理,防止出错时仍然返回rsText.