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

时间:2009-12-23 20:51:21

标签: javascript ajax

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

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

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

我的问题是,如何从stateChanged函数中获取false或true的结果,以成为snappyajaxfunction的返回值。

我尝试过这样做:kick = request.onreadystatechange = StateChanged没有运气。

我还尝试将responsetxt保存到全局变量,然后在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并且表单将不会提交,如果表单提交并且用户被带到欢迎页面...

5 个答案:

答案 0 :(得分:1)

你可以这样做:

function stateChanged() 
{ 
    if (request.readyState==4)
    {   
       OnStateChanged(request.responseText);
    }           
}

其中OnStateChanged是一个充当事件处理程序的函数......

编辑:在OnStateChanged中,您可以根据回复提交或不提交表单

EDIT2:当您检查u / p时在服务器上,如果它们正确,请立即登录用户并将状态返回给JavaScript ..然后在JavaScript中而不是重新提交表单,只需重新加载/重定向页面如果成功或显示警告,否则......

通过异步操作从函数中返回一些东西是不可能的......执行的原始线程早已不复存在。异步操作由另一个线程执行(如果我没记错的话,请不要火焰)。

由于

答案 1 :(得分:1)

jQuery不会自动修复他试图根据异步请求的结果提交提交的事实。

您可以做的是:

1)将表单设置为onsubmit以简单地调用snappyajaxfunction();

2)在stateChanged中,如果readystate为4,则获取对表单的引用并执行以下操作:

form.onsubmit = function() { return true; };
form.submit();

基本上 - 将onsubmit设置为始终返回true,然后强制它再次提交。为了增加可用性,您可能希望在等待statechanged发生时禁用导致提交的按钮。然后重新启用它。

答案 2 :(得分:0)

随时在ajax上查看此tutorial

它将向您展示如何正确使用ajax一步一步

正如inkedmn所建议的,我建议使用jquery或任何其他js框架

答案 3 :(得分:0)

问题是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);

答案 4 :(得分:0)

为了使你的代码工作,你可以使用闭包并将函数作为参数传递。
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);

闭包允许'request'在处理onreadystatechange的函数中可用。 函数'fn'作为snappyajaxfunction的参数传递。