如何将javascript函数组合在一起?

时间:2010-02-21 15:26:12

标签: javascript ajax

以下是我在HTML页面中使用的JavaScript代码

<script type="text/javascript">
function loadXMLDoc(HTTP)
{
    var xmlHttp;
    try {  
        xmlHttp=new XMLHttpRequest();
    } catch (e) { 
        try {    
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");   
        } catch (e) {   
            try {     
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   
            } catch (e) {      
                alert("Your browser does not support AJAX!");      
                return false; 
            }    
        } 
    }

    xmlHttp.onreadystatechange=function() {
        if (xmlHttp.readyState==4) {
            alert(xmlHttp.responseText);
        }
    }  

    var params ="dd=123";
    xmlHttp.open("POST",HTTP,true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.send(params);
}
</script>

在下面的javascript我的魔杖中激活每个ajax函数

<script type="text/javascript">

// here i wand to send function together
return (loadXMLDoc('Page1.asp') && loadXMLDoc('Page2.asp') && loadXMLDoc('Page3.asp')); 
</script>

但问题是我没有得到“返回”(意味着第二和第三功能不起作用)

只有第一个功能正常工作

希望得到您的回复

3 个答案:

答案 0 :(得分:1)

你的函数loadXMLDoc()没有返回任何内容,在该函数的末尾添加“return true”。

    xmlHttp.send(params);

    return true;
}

请注意,loadXMLDoc()的真正返回意味着您已成功启动AJAX请求。它将在未来一段时间内完成,这将导致onreadystatechange被调用。因此,您可以并行启动多个AJAX请求。

如果您想按顺序进行多次AJAX调用,请尝试以下操作:

function doAjaxRequest( url, onreadystatechange )
{
    var xmlHttp;
    try {  
        xmlHttp=new XMLHttpRequest();
    } catch (e) {
        try {    
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");   
        } catch (e) {   
            try {     
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   
            } catch (e) {      
                alert("Your browser does not support AJAX!");      
                return false; 
            }    
        } 
    }

    xmlHttp.onreadystatechange = onreadystatechange;

    var params = "dd=123";
    xmlHttp.open("POST", url, true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.send(params);
}

function loadXMLDocs( HTTP )
{
    var loadNextFile = function() {
        if (HTTP.length != 0) {
            var url = HTTP.unshift();
            doAjaxRequest( url, onreadystatechange );
        }
    }

    var onreadystatechange = function() {
        if (this.readyState==4) {
            alert(xmlHttp.responseText);

            loadNextFile();
        }
    }

    loadNextFile();
}

loadXMLDocs( ['Page1.asp', 'Page2.asp', 'Page3.asp'] );

答案 1 :(得分:1)

记得在声明中:

return (loadXMLDoc('Page1.asp') && loadXMLDoc('Page2.asp') && loadXMLDoc('Page3.asp'));  

逻辑上转换为:

if (loadXMLDoc('Page1.asp')){
    if (loadXMLDoc('Page2.asp')){
        if (loadXMLDoc('Page3.asp')){
            return true;
        }
    }
}
return false;

因此,只有当前一个函数返回true时,才会调用每个连续的loadXMLDoc()函数调用。

答案 2 :(得分:0)

哇谈论缩进地狱。这应该会更好;

<script type="text/javascript">
function loadXMLDoc(HTTP){
var xmlHttp;
try{  
    xmlHttp=new XMLHttpRequest();  }
    catch (e){ 
        try{    
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");   
        }catch (e){   
            try{     
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   
            }catch (e){      
                alert("Your browser does not support AJAX!");      
                return false; 
            }
        }
    }
    xmlHttp.onreadystatechange=function(){
        if(xmlHttp.readyState==4){
            alert(xmlHttp.responseText);
        }
    }   
    var params ="dd=123";
    xmlHttp.open("POST",HTTP,true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.send(params);

    return true;
}
</script>