Javascript 如何从onreadystatechange=function()调用的函数返回变量
我将ajax技术与php结合使用,我想知道如何从onreadstatechange调用的函数中获取返回变量 一个java函数被调用onsubmit,然后调用一个php脚本来验证数据库中的某些内容,并根据结果返回true或false 这里是我遇到问题的地方,我希望onsubmit=“return snappyajaxfunction()”根据php的结果返回false或true 我的问题是,如何从stateChanged函数中得到false或true的结果,从而成为snappyajaxfunction的返回值 我尝试这样做是为了好玩:result=request.onreadystatechange=stateChange,但运气不佳 我还尝试将responseText保存到全局变量,然后在snappyajaxfunction中返回全局变量,但没有成功Javascript 如何从onreadystatechange=function()调用的函数返回变量,javascript,ajax,Javascript,Ajax,我将ajax技术与php结合使用,我想知道如何从onreadstatechange调用的函数中获取返回变量 一个java函数被调用onsubmit,然后调用一个php脚本来验证数据库中的某些内容,并根据结果返回true或false 这里是我遇到问题的地方,我希望onsubmit=“return snappyajaxfunction()”根据php的结果返回false或true 我的问题是,如何从stateChanged函数中得到false或true的结果,从而成为snappyajaxfuncti
snappyajaxfunction()
{
request.onreadystatechange=stateChanged;
request.open("GET",url,true);
request.send(null);
return result;
}
function stateChanged()
{
if (request.readyState==4)
{
return request.responseText;
}
}
此脚本的目的是验证用户输入的用户名/密码与存储在我的数据库中的用户名/密码。如果不匹配,则返回false,表单将不提交,如果匹配,表单将提交,用户将进入欢迎页面…您可以执行以下操作:
function stateChanged()
{
if (request.readyState==4)
{
OnStateChanged(request.responseText);
}
}
其中,OnStateChanged
是一个充当事件处理程序的函数
编辑:在OnStateChanged
中,您可以根据回复提交或不提交表单
EDIT2:在服务器上,当您检查u/p时,如果u/p正确,则将用户正确登录并将状态返回到JavaScript。。然后在JavaScript中,不需要重新提交表单,只要重新加载/重定向页面(如果成功),或者显示警报(否则)
只是不可能通过函数中的异步操作从函数中返回某些内容。。。最初的执行线程早已消失。异步操作由另一个线程执行(如果我没记错的话,请不要触发)
谢谢请在ajax上随意查看 它将逐步向您展示如何正确使用ajax
正如Inkedn所建议的,我建议使用或使用任何其他js框架jQuery都不会自动修复这样一个事实,即他试图将提交基于异步请求的结果 您可以执行以下操作:
form.onsubmit = function() { return true; };
form.submit();
1) 将表单onsubmit设置为只调用snappyajaxfunction()
2) 在stateChanged中,如果readystate为4,则获取对表单的引用并执行以下操作:
form.onsubmit = function() { return true; };
form.submit();
基本上-将onsubmit设置为始终返回true,然后强制它再次提交。为了增加可用性,您可能希望在等待statechanged发生时禁用导致提交的按钮。然后重新启用它。问题在于ajax调用是异步的。这意味着响应与请求是分开的。你必须修改你的代码来处理这个问题。您不能(不应该)使http调用同步 看看这个代码。它可以工作,您可以阅读响应:
var req = new XMLHttpRequest();
req.open('GET', url, true);
req.onreadystatechange = function (ev) {
if (req.readyState == 4) {
alert(req.responseText);
}
};
req.send(null);
为了使代码正常工作,可以使用闭包和传递函数作为参数。
2属性javascript非常擅长
snappyajaxfunction(url, fn)
{
var request...
request.onreadystatechange=function()
{
if (request.readyState==4)
{
fn(request.responseText);
}
};
request.open("GET",url,true);
request.send(null);
}
要使用它,您可以构建如下函数
var doSomething = function(response){
alert(response);
};
snappyajaxfunction('/country/code/32', doSomething);
闭包允许“请求”在处理onreadystatechange的函数中可用。
函数“fn”作为snappyajaxfunction的参数传递。您不使用类似jQuery的框架进行此操作有什么特殊原因吗?-同样的问题。也许这对你有帮助。我对编码还不熟悉,我喜欢先学习艰苦的方法,所以我知道我想的事情的机制?也许这是一项作业,或者是学习基础。。就我个人而言,如果像这样的问题不是小事,我不会告诉别人使用jQuery。。。这只是将问题埋得更深(我认为他希望长期使用严肃的JavaScript)可能是一个好方法。出于这个原因,我建议至少编写一个不带任何框架的全功能ajax脚本。看起来有点像黑客作业,但它会起作用。如果希望它看起来不那么黑客,请将submit按钮更改为常规按钮,并调用snappyajaxfunction()。不必覆盖表单的onsubmit,只需调用form.submit();如果readystate是4.Hum,我不确定我是否理解这对我有什么帮助。将响应传递到函数fn,然后对结果发出警报,snappyajaxfunction如何返回警报..?snappyajaxfunction不返回任何内容。这是异步的,您调用的时间不会紧跟在您得到响应的时间之后。诸如“fn”之类的回调函数是处理此类异步的典型方法。当readyState为4时,将使用responseText调用函数fn。在函数doSomething中,您有自己的响应,通常向用户显示一些内容(即:本例中的警报)@麦克:在某些情况下,回调函数无法工作,因为调用者肯定需要处理请求的结果。我最终将其设置为一个同步函数,并通过将状态更改结果设置为全局变量,然后在snappyajax结束时返回它来工作。打开(“获取”,url,false)@payling:请记住,同步查询已被弃用,使用它们将引发错误。请阅读响应。。。但是,如果不使用全局变量(例如:知道脚本是否作为全局变量运行),调用方就不能处理它。