Значение извлечения Javascript из httprequest - PullRequest
0 голосов
/ 14 марта 2011

Сценарий php возвращает значение, и 1-е предупреждение срабатывает.

Я не могу сослаться на значение, возвращенное httprequest при 2-м предупреждении.В идеале я бы вызвал функцию 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 ]

6 голосов
/ 14 марта 2011

Вы не можете «вернуть» значения из успешных вызовов XMLHttpRequest. Вы можете выполнять любую необходимую вам обработку внутри функции обратного вызова.

XMLHttpRequests выполняется асинхронно. Вы не можете заставить свой код «ждать» их (если вы не сделаете их синхронными) (и вы действительно, действительно, не должны этого делать). Однако в этом нет особой необходимости, поскольку система выполнения вызовет ваш обработчик readystatechange после завершения запроса. Из этого кода вы можете делать все, что вам нужно.

Этот факт требует, чтобы вы немного по-другому думали о том, как писать код, но на самом деле это не так уж сложно. Например, если вы склонны написать функцию «processResults ()», тогда вы все равно можете это сделать & mdash; Вы бы просто назвали это из внутри обработчиком readystatechange.

1 голос
/ 08 декабря 2015

Я вижу, что этой теме 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>

<i>FILE: upload.js</i>

    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);
    }

<i>FILE: upload.php</i>

    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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...