Browser XMLHttpRequest响应';未定义'。。。除非先警告变量

Browser XMLHttpRequest响应';未定义'。。。除非先警告变量,browser,xmlhttprequest,alert,Browser,Xmlhttprequest,Alert,混蛋 我在javascript中使用xmlhttprequest,调用php页面。php页面只回显一个字符串 当xmlhttprequest点击4200时,响应文本保存为字符串。另外,xmlhttprequest在一个函数中,该函数返回响应文本 问题:函数返回未定义的,但我通过添加一个警报(字符串)绕过了这个错误。然后警报状态为“undefined”,函数在返回时以字符串形式传递回显值 对于Opera、Chrome、Firefox和Internet Explorer,只有FF和IE填充响应文本。

混蛋

我在javascript中使用xmlhttprequest,调用php页面。php页面只回显一个字符串

当xmlhttprequest点击4200时,响应文本保存为字符串。另外,xmlhttprequest在一个函数中,该函数返回响应文本

问题:函数返回
未定义的
,但我通过添加一个
警报(字符串)
绕过了这个错误。然后警报状态为“undefined”,函数在返回时以字符串形式传递回显值

对于Opera、Chrome、Firefox和Internet Explorer,只有FF和IE填充响应文本。Opera和Chrome根本不起作用

代码:

函数xmlhttpr(帮助、类型、地址)
{
var字符串;
如果(帮助)
{
字符串='xmlhttpr函数:
参数:(帮助、类型、地址)
作为假/真,
get/post,
/addr.ess?h=elp'; 返回字符串; } 如果(!地址) { 字符串='xmlhttpr(0,类型,地址)中缺少参数'; 返回字符串; } 如果(类型==0) { 类型='GET'; } 如果(类型==1) { 类型='POST'; } if(window.XMLHttpRequest) { xmlhttp=新的XMLHttpRequest(); } 其他的 { xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”); } xmlhttp.onreadystatechange=函数() { //警报(this.readyState+''+this.status); if(this.readyState==4&&this.status==200) { 字符串=this.responseText; } } open(类型、地址、true); xmlhttp.send(); 警报(字符串);//臭 如果(字符串) { 返回字符串; } 其他的 { 返回“请求失败”; } }
XMLHttpRequest也称为AJAX,A代表异步,当您调用
.send()
时,请求会发送到服务器,但浏览器不会等待请求完成,它会直接跳到下一行,即
警报(字符串)
由于请求尚未完成,因此它自然会被取消定义

所有AJAX请求本质上都是异步的,这意味着浏览器在跳到
.send
之后的下一行之前从不等待请求完成

现在,在您的情况下,很难构建您的函数,因此最好完全删除该函数,无论您在何处调用该函数,只需执行请求,并在
内部执行
onreadystatechanged
,如果
您有字符串,请执行您想要执行的操作(向用户显示、处理,等等)

顺便说一句,有同步XMLHttpRequest,但它已被弃用,不应使用,因为javascript代码自然地在一个线程中执行,甚至是UI代码,您不希望挂起按钮等待服务器的某些请求完成


那么它在FF和IE中起作用了?!!这是巧合,因为请求恰好完成,字符串恰好填充。

@Blitterator别提了,我建议您阅读浏览器的事件循环
    function xmlhttpr(help,type,address)
    {
        var string;
        if ( help )
        {
            string = 'The xmlhttpr function:<br>params: (help,type,address) 
   <br>as<br>false/true,<br>get/post,<br>/addr.ess?h=elp';
           return string;
       }
       if ( !address )
       {
           string = 'Parameter missing in xmlhttpr(0,type,address)';
           return string;
       }
       if ( type == 0 )
       {
           type = 'GET';
        }
       if (type == 1 )
       {
            type = 'POST';
        }
       if ( window.XMLHttpRequest )
       {
            xmlhttp = new XMLHttpRequest();
        }
       else
       {
            xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" );
      }
       xmlhttp.onreadystatechange = function()
       {
            //alert(this.readyState + ' ' + this.status);
            if ( this.readyState==4 && this.status==200 )
            {
                string = this.responseText;
            }
        }
        xmlhttp.open( type , address , true );
        xmlhttp.send();
        alert(string); //STINKY
        if ( string )
        {
            return string;
        }
        else
        {
            return 'Request failure';
        }
    }