Javascript 如何从onreadystatechange=function()调用的函数返回变量

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

我将ajax技术与php结合使用,我想知道如何从onreadstatechange调用的函数中获取返回变量

一个java函数被调用onsubmit,然后调用一个php脚本来验证数据库中的某些内容,并根据结果返回true或false

这里是我遇到问题的地方,我希望onsubmit=“return snappyajaxfunction()”根据php的结果返回false或true

我的问题是,如何从stateChanged函数中得到false或true的结果,从而成为snappyajaxfunction的返回值

我尝试这样做是为了好玩:result=request.onreadystatechange=stateChange,但运气不佳

我还尝试将responseText保存到全局变量,然后在snappyajaxfunction中返回全局变量,但没有成功

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:请记住,同步查询已被弃用,使用它们将引发错误。请阅读响应。。。但是,如果不使用全局变量(例如:知道脚本是否作为全局变量运行),调用方就不能处理它。