从单独的文件返回 AJAX 响应文本
Returning AJAX responseText from a seperate file
这个问题过去可能已经被问过一百万次,但我还没有找到解决方案。所以我再问一次,希望少一点 激进的答案,如"看别的地方"或"不要重复" 问题"。如果读者有冲动输入任何或类似的 前面提到的句子,我只能要求读者不要 从这样做并完全忽略这篇文章。任何帮助都很大 赞赏。
问题所在
在我的程序中,AJAX 脚本用于与 PHP 脚本进行通信。没有语法错误。AJAX 很好地接收responseText
并发出警报。
alert(request.responseText); //this works as desired
但无法将其返回到另一个函数。
return(request.responseText); //this actually returns undefined
完整代码 客户端文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>test</title>
<script type="text/javascript" language="javascript" src="ajax.js"></script>
<script type="text/javascript" language="javascript">
function createXMLHttp()
{
var xmlHttp = null;
if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlHttp;
}
function ajax_phprequest(data, php_file)
{
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);
return request.responseText; //changed from return(request.responseText;);
}
}
}
function foo()
{
alert(ajax_phprequest("user=defuser&pass=123456","auth.php"));
}
</script>
</head>
<input type="button" id="somebutton" value="Call foo()" onclick="foo();" />
<body>
</body>
</html>
完整代码身份验证.php文件
<?php
$user;
$pass;
if (isset($_POST['user'])) $user = $_POST['user'];
else
{
echo 'err_u_Username is not specified';
exit();
}
if (isset($_POST['pass'])) $pass = $_POST['pass'];
else
{
echo 'err_p_Password is not specified';
exit();
}
if ($user = 'defuser' && $pass = '123456') echo ('That''s right!');
else echo ('That''s not right!');
?>
这可以通过将代码包含在与文档相同的文件中来轻松解决。但是我希望从不同的文件调用该函数,然后将其返回到具有foo()
的文件或文档。简单地说,我希望 AJAX 函数返回 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);
});
}
这是因为调用是异步的,所以你不能以通常的方式从堆栈返回,即在返回 ajax 响应之前评估你的alert(ajax_phprequest("user=defuser&pass=123456","auth.php"));
......您需要使用回调:
function callback( text ){
// something
}
...
if (request.readyState == 4){
callback( request.responseText );
}
- 不再使用innerHTML进行AJAX响应.(代码未得到响应)
- 为什么可以't我使用了AJAX响应的一部分
- Ajax响应转换
- 如何在数据表中设置从Ajax响应选中的复选框
- 在Javascript中的ajax响应之后未调用Dropdown事件
- RubyonRails-Ajax响应的问题
- Ajax:Ajax响应中的链接不起作用
- 如何执行ajax响应返回的javascript函数
- 带有 AJAX 响应或 AJAX 响应的 IF 条件.响应.Text 不起作用
- 正在检查ajax响应中的错误数据
- 如何从ajax响应中重新加载整个页面
- 如何使用jQuery/Ajax响应特定的提交按钮
- 是浏览器在AJAX响应中自动处理的HTTP标头
- Masony无法处理ajax响应
- 使用yii2表单等待ajax响应
- jquery返回ajax响应和用户定义的变量到函数
- 使用Ajax响应更新TextBox
- 如何在jquery ajax响应后设置jquery滑块的起始值
- Rails 4中不执行Ajax响应
- jquery解析ajax响应