Javascript从http请求返回值

时间:2011-03-14 18:51:55

标签: javascript xmlhttprequest

php脚本返回一个值,第一个警报正常工作。

我无法在第二个警报中引用httprequest返回的值。理想情况下,我会调用函数get_captcha() - 它会返回值 - 它只是我不知道如何做到这一点。

我意识到在全球范围内设置变量可能不是最好的方法,但这是我唯一能想到的 - 我对替代方案持开放态度。

  <script type="text/javascript">
   var url = "captcha_get_code.php"; // The server-side script 
   var cap;

   function ValidateForm() {
    get_captcha()
    alert(cap); //undefined

    }

    function get_captcha() {      
      http.open("GET", url, true); 
       http.onreadystatechange = handleHttpResponse; 
       http.send(null); 

}

  function handleHttpResponse() {    
    if (http.readyState == 4) { 
       if (http.status==200) { 
            //return http.responseText; 
        cap=http.responseText; 
            alert(cap);  //this one works
            }

        } 
    } 



function getHTTPObject() { 
  var xmlhttp; 

  if(window.XMLHttpRequest){ 
    xmlhttp = new XMLHttpRequest(); 
  } 
  else if (window.ActiveXObject){ 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    if (!xmlhttp){ 
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); 
    } 

} 
  return xmlhttp;   
} 
var http = getHTTPObject(); // We create the HTTP Object 





</script>   

2 个答案:

答案 0 :(得分:6)

无法从成功的XMLHttpRequest调用中“返回”值。您可以执行您需要的任何类型的处理内部回调函数。

XMLHttpRequests是异步执行的。你不能让你的代码“等待”它们(除非你让它们同步)(你真的,真的不应该这样做)。但是,没有必要,因为运行时系统会在请求完成时调用“readystatechange”处理程序。从该代码中,您可以随心所欲地做任何事情。

这个事实要求你对如何编写代码有所不同,但实际上并没有那么多的调整。例如,如果您倾向于编写“processResults()”函数,那么您仍然可以这样做 - 您只需从内部“readystatechange”处理程序中调用它。

答案 1 :(得分:1)

我看到这个帖子已经4年了,但它有错误答案

您可以从成功的XMLHttpRequest调用中获取返回值。 我的项目使用WebSocket,但它使用XMLHttpRequest上传图像。

    In a javascript, call uploadSend(containerID) where all <img> are stored.


    // ----- uploadSend()
    // ----- This function sends all objects in a container (containerID)
    // ----- All object has to be <img>

FILE: upload.js

    function uploadSend(containerID) {
      var elm = document.getElementById(containerID);
      for (i=0; i<elm.childNodes.length; i++) {
        var form = new FormData();
        form.append('id', elm.childNodes[i].id);
        form.append('src', elm.childNodes[i].src);
        TOS(form);
      }
    }

    function xhrState(self) {
      if ((self.readyState == 4) && (self.status === 200))
        console.log(self.responseText);
    }

    function xhrProgress(event) {
      if (event.lengthComputable)
        if (event.loaded == event.total)
          console.log('Image 100% uploaded.');
    }

    function TOS(form) {
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function () { xhrState(this); }
      xhr.open('POST', '/upload.php');
      xhr.upload.onprogress = function(event) { xhrProgress(event); }
      xhr.send(form);
    }

FILE: upload.php

    header("Content-type: text/plain");

    $filename = '/var/www/public/upload/'.microtime(true);

    // ----- Save a complete file for what we did get.
    $hnd = fopen($filename . 'TXT', 'wb');
    fwrite($hnd, print_r($_COOKIE, true));
    fwrite($hnd, print_r($_GET, true));
    fwrite($hnd, print_r($_FILES, true));
    fwrite($hnd, print_r($_POST, true));
    fclose($hnd);

    // ----- Save just jpg for the images we did get.
    $hnd = fopen($filename . 'jpg', 'wb');
    $image = explode(',', $_POST['src']);
    fwrite($hnd, base64_decode($image[1]));
    fclose($hnd );

    // ----- Type the result that you want back.
    echo "{$filename}.jpg";