Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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 从Javascript函数返回值_Php_Javascript_Xmlhttprequest - Fatal编程技术网

Php 从Javascript函数返回值

Php 从Javascript函数返回值,php,javascript,xmlhttprequest,Php,Javascript,Xmlhttprequest,我使用以下代码显示函数test2返回的值 输出显示为:x的值为:未定义 有人能帮我解释一下如何从函数test2返回值吗?请注意,函数test2是XMLHTTPRequest <script language="javascript"> function test1() { var x = test2(); alert('Value of x is: '+x); } function test2() {

我使用以下代码显示函数
test2
返回的值

输出显示为:x的值为:未定义

有人能帮我解释一下如何从函数
test2
返回值吗?请注意,函数
test2
XMLHTTPRequest

<script language="javascript">

    function test1()
    {
        var x = test2();
        alert('Value of x is: '+x);
    }

    function test2()
    {
        if(window.XMLHttpRequest)
        {
            abcd= new XMLHttpRequest();
        }
        else
        {
            abcd=new ActiveXObject("Microsoft.XMLHTTP");
        }

        abcd.onreadystatechange=function()
        {
            if (abcd.readyState==4 && abcd.status==200)
            {
                    return abcd.responseText; // it is getting value 2 here
            }
            else if(abcd.readyState < 4)
            {
                return -1;
            }
        }
        abcd.open("GET",sam.php,true);
        abcd.send();
    }

</script>

函数test1()
{
var x=test2();
警报('x的值为:'+x);
}
函数test2()
{
if(window.XMLHttpRequest)
{
abcd=新的XMLHttpRequest();
}
其他的
{
abcd=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
about.onreadystatechange=函数()
{
如果(abcd.readyState==4&&abcd.status==200)
{
return abcd.responseText;//这里得到的是值2
}
else if(abcd.readyState<4)
{
返回-1;
}
}
open(“GET”,sam.php,true);
abcd.send();
}

函数
test2
立即返回(值
未定义)。您需要等待AJAX调用返回,然后再尝试从中获取任何数据。这是AJAX的(A)同步部分

abcd.onreadystatechange=function()
{
    if (abcd.readyState==4 && abcd.status==200)
    {
        // Put the code that deals with the returned value here...
    }
    else if(abcd.readyState < 4)
    {
        return -1;
    }
}
abcd.onreadystatechange=function()
{
如果(abcd.readyState==4&&abcd.status==200)
{
//将处理返回值的代码放在这里。。。
}
else if(abcd.readyState<4)
{
返回-1;
}
}

函数
test2
立即返回(值
未定义)。您需要等待AJAX调用返回,然后再尝试从中获取任何数据。这是AJAX的(A)同步部分

abcd.onreadystatechange=function()
{
    if (abcd.readyState==4 && abcd.status==200)
    {
        // Put the code that deals with the returned value here...
    }
    else if(abcd.readyState < 4)
    {
        return -1;
    }
}
abcd.onreadystatechange=function()
{
如果(abcd.readyState==4&&abcd.status==200)
{
//将处理返回值的代码放在这里。。。
}
else if(abcd.readyState<4)
{
返回-1;
}
}

听起来您希望XML HTTP请求中的值返回
test2
。这是不可能的,因为这个XML HTTP请求是异步执行的,
test2
是同步执行的

正确的处理方法是将回调传递给
test2
,以便在请求完成时执行。回调提供了XML HTTP请求返回的值。比如说

function test1() {
  test2(function (x) {
    alert('The value of x is ' + x);
  });
}

function test2(callback) {
  ...
  abcd.onreadystatechange=function() {
    if (abcd.readyState==4 && abcd.status==200) {
      callback(abcd.responseText);
    } else {
      callback(-1);
    }
  }
  ...
}

听起来您希望XML HTTP请求的值是
test2
的返回值。这是不可能的,因为这个XML HTTP请求是异步执行的,
test2
是同步执行的

正确的处理方法是将回调传递给
test2
,以便在请求完成时执行。回调提供了XML HTTP请求返回的值。比如说

function test1() {
  test2(function (x) {
    alert('The value of x is ' + x);
  });
}

function test2(callback) {
  ...
  abcd.onreadystatechange=function() {
    if (abcd.readyState==4 && abcd.status==200) {
      callback(abcd.responseText);
    } else {
      callback(-1);
    }
  }
  ...
}

正如预期的那样,函数test1调用test2,从而生成XMLHttpRequest。但这里的问题在于你的时机。仅当状态更改时才会调用onreadystatechange。当状态改变时,函数test2已经退出,没有返回值


相反,您的警报应该发生在您当前有
return abcd.responseText

的地方。正如预期的那样,函数test1调用test2,从而生成XMLHttpRequest。但这里的问题在于你的时机。仅当状态更改时才会调用onreadystatechange。当状态改变时,函数test2已经退出,没有返回值


相反,您的警报应该发生在您当前有
返回abcd.responseText

的位置。函数test2没有返回任何内容,但您分配给onreadystate change的回调是。您应该从此回调调用test1,并将x的值传递给它,如下所示:

function test1(x)
{
    alert("X is: " + x);
}

function test2()
{
    // ...
    abcd.onreadystatechange=function()
    {
        var x = -1;
        if (abcd.readyState==4 && abcd.status==200)
        {
                x = abcd.responseText; // it is getting value 2 here
        }
        test1(x); // call test1 and pass in x
    }
    / ...
}

函数test2没有返回任何内容,但是您分配给onreadystate change的回调是。您应该从此回调调用test1,并将x的值传递给它,如下所示:

function test1(x)
{
    alert("X is: " + x);
}

function test2()
{
    // ...
    abcd.onreadystatechange=function()
    {
        var x = -1;
        if (abcd.readyState==4 && abcd.status==200)
        {
                x = abcd.responseText; // it is getting value 2 here
        }
        test1(x); // call test1 and pass in x
    }
    / ...
}

您不能这样做,您的ajax请求是异步的。因此,当您执行test2()时,不会得到任何值

请注意,定义onreadystate函数时,它会从服务器获得各种响应,这就是为什么要验证
readystate 4
statuscode 200
,您将多次使用该函数。当服务器完成时,如果一切正常,它将返回这些代码

你应该这样做:

<script language="javascript">

    function test1()
    {
        var x = test2();       
    }

    function test2()
    {
        if(window.XMLHttpRequest)
        {
            abcd= new XMLHttpRequest();
        }
        else
        {
            abcd=new ActiveXObject("Microsoft.XMLHTTP");
        }

        abcd.onreadystatechange= test2Result;
        abcd.open("GET",sam.php,true);
        abcd.send();
    }

    function test2Result()
    {
            if (abcd.readyState==4)
            {
                 if(abcd.status==200)
                 {
                    alert(abcd.responseText); // it is getting value 2 here
                 }
                 else 
                 {
                    alert('Something failed');
                 }
            } 

    }

</script>

函数test1()
{
var x=test2();
}
函数test2()
{
if(window.XMLHttpRequest)
{
abcd=新的XMLHttpRequest();
}
其他的
{
abcd=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
conreadystatechange=test2Result;
open(“GET”,sam.php,true);
abcd.send();
}
函数test2Result()
{
如果(abcd.readyState==4)
{
如果(abcd.status==200)
{
警报(abcd.responseText);//这里的值为2
}
其他的
{
警报(“某些东西失败了”);
}
} 
}

您不能这样做,您的ajax请求是异步的。因此,当您执行test2()时,不会得到任何值

请注意,定义onreadystate函数时,它会从服务器获得各种响应,这就是为什么要验证
readystate 4
statuscode 200
,您将多次使用该函数。当服务器完成时,如果一切正常,它将返回这些代码

你应该这样做:

<script language="javascript">

    function test1()
    {
        var x = test2();       
    }

    function test2()
    {
        if(window.XMLHttpRequest)
        {
            abcd= new XMLHttpRequest();
        }
        else
        {
            abcd=new ActiveXObject("Microsoft.XMLHTTP");
        }

        abcd.onreadystatechange= test2Result;
        abcd.open("GET",sam.php,true);
        abcd.send();
    }

    function test2Result()
    {
            if (abcd.readyState==4)
            {
                 if(abcd.status==200)
                 {
                    alert(abcd.responseText); // it is getting value 2 here
                 }
                 else 
                 {
                    alert('Something failed');
                 }
            } 

    }

</script>

函数test1()
{
var x=test2();
}
函数test2()
{
if(window.XMLHttpRequest)
{
abcd=新的XMLHttpRequest();
}