Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从单独的文件返回AJAX responseText_Php_Javascript_Ajax_Responsetext - Fatal编程技术网

Php 从单独的文件返回AJAX responseText

Php 从单独的文件返回AJAX responseText,php,javascript,ajax,responsetext,Php,Javascript,Ajax,Responsetext,这个问题在过去可能被问过一百万次,但我还没有找到解决办法。所以我又问了一遍,希望能少一点 咄咄逼人的回答,比如看其他地方或者不要重复 问题。如果读者有冲动键入以下任何一种或类似的 上述句子,我只能要求读者克制 不要这样做,完全忽略这篇文章。任何帮助都是巨大的 谢谢 问题 在我的程序中,AJAX脚本可以与PHP脚本通信。没有语法错误。AJAX很好地接收响应文本并发出警报 alertrequest.responseText//这可以按预期工作 但无法将其返回到另一个函数 returnrequest.

这个问题在过去可能被问过一百万次,但我还没有找到解决办法。所以我又问了一遍,希望能少一点 咄咄逼人的回答,比如看其他地方或者不要重复 问题。如果读者有冲动键入以下任何一种或类似的 上述句子,我只能要求读者克制 不要这样做,完全忽略这篇文章。任何帮助都是巨大的 谢谢

问题

在我的程序中,AJAX脚本可以与PHP脚本通信。没有语法错误。AJAX很好地接收响应文本并发出警报

alertrequest.responseText//这可以按预期工作

但无法将其返回到另一个函数

returnrequest.responseText//这实际上返回未定义的

完整代码 客户端文件

完整代码 auth.php文件


通过将代码包含在与文档相同的文件中,可以很容易地解决这个问题。但是我希望从另一个文件调用该函数,然后将其返回到包含foo或文档的文件。简单地说,我希望AJAX函数返回responseText,而不是每次都给出“undefined”。如果这与同步有关:我想知道解决这个问题的任何方法。

这是因为调用是异步的,所以您不能以通常的方式从堆栈返回,即您的alertajax\u phprequestuser=defuser&pass=123456,auth.php;在返回ajax响应之前进行评估。。。您需要使用回调:

function callback( text ){
    // something
}

...
if (request.readyState == 4){
    callback( request.responseText );
}

已经提到了它的要点,但我想更深入地解释一下为什么这不起作用

您有以下代码:

request.onreadystatechange = function() 
{
    if (request.readyState == 4)
    {
        document.write(request.responseText);
        return(request.responseText);
    }
}
基本上,您将onreadystatechange事件设置为匿名函数的值。在该匿名函数中,您将返回一个值,该值不会返回给ajax_phprequest的调用方,而是返回给匿名函数的调用方,匿名函数是事件系统,它不太关心返回的值

这是因为所有这些都是异步发生的。换句话说,您调用ajax_phprequest,此时发生的一切都发生在屏幕后面。用户可以像什么都没有发生一样继续工作。然而,在后台,php文件被请求并有望返回。当这种情况发生时,您可以使用内容,但调用ajax_phprequest的时刻早已过去

正确的方法是使用回调函数。它可能看起来像这样:

function ajax_phprequest(data, php_file, callback)
{
    var request =  createXMLHttp();
    request.open("POST", php_file, true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send(data);
    request.onreadystatechange = function() 
    {
        if (request.readyState == 4)
        {
            document.write(request.responseText);
            callback(request.responseText);
        }
    }
}

function foo()
{
    ajax_phprequest("user=defuser&pass=123456","auth.php", function (text)
    {
        alert(text);
    });
}

告诉人们应该如何回应你的问题不是一个好的做法……只需将返回的值放在一个隐藏字段中,然后调用另一个函数,并从该隐藏字段中获取值。因此回调无法返回我尝试过的值,它仍然返回未定义的值,但必须执行其中指定的任何操作?这将起作用,但我希望找到一种解决方案,可以将值返回到另一个函数的不同文件中。否回调无法返回值。。。您需要使用回调或事件分派器/侦听器—确切地说,回调可以返回一个值,但由于同步的原因,您无法从顺序代码中使用它
request.onreadystatechange = function() 
{
    if (request.readyState == 4)
    {
        document.write(request.responseText);
        return(request.responseText);
    }
}
function ajax_phprequest(data, php_file, callback)
{
    var request =  createXMLHttp();
    request.open("POST", php_file, true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send(data);
    request.onreadystatechange = function() 
    {
        if (request.readyState == 4)
        {
            document.write(request.responseText);
            callback(request.responseText);
        }
    }
}

function foo()
{
    ajax_phprequest("user=defuser&pass=123456","auth.php", function (text)
    {
        alert(text);
    });
}