Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Проблема с выводом XMLHttpRequest


Автор: korob2001 14.11.2007, 07:44
Привет!!!
Столкнулся с такой проблемой. Есть такая страничка HTML:
Код

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Работа XMLHttpRequest</title>
<script type="text/javascript" src="./scripts/search.js"></script>
<script type="text/javascript">
    <!--//
        function getTxt() {
            document.getElementById('txt').innerHTML = getServerSideText('/cgi-bin','test.pl','');
        }
    //-->
</script>
</head>
<body>
    <form>
        <table width="300" cellspacing="5" cellpadding="5" border="0">
            <tr>
             <td style="text-align:right">
                 <input type="button" value="Get Text" onclick="getTxt()" />
                </td>
            </tr>
        </table>
        <br/><br/>
        <div id="txt" style="font-size:18px; font-weight:bold; color:#cc0000">&nbsp;</div>
    </form>     
</body>
</html>

Как видно здесь я подключаю файл search.js, в котором через XMLHttpRequest подключаюсь к Perl программе на стороне сервера, которая выводит строку. Вот код файла search.js
Код

// JavaScript Document
function createXmlHttpRequest() {
  var xhreq = false;
  try {
    xhreq = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xhreq = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
    
    xhreq = false;
    }
  }
  if (!xhreq && typeof XMLHttpRequest!='undefined') {
    xhreq = new XMLHttpRequest();
  }
  return xhreq;
}

function getServerSideXml(path, fileName, params) {
    var req = createXmlHttpRequest();
    var xml = "";
    req.open('GET', path + '/' + fileName + '?r=' + Math.random() + '&' + encodeURIComponent(params), true); 
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
          if(req.status == 200) {
                xml = req.responseXML;
            }
        }
    };
    req.send(null);
    return xml;
}

function getServerSideText(path, fileName, params) {
    var req = createXmlHttpRequest();
    var text = "";
    req.open('GET', path + '/' + fileName + '?r=' + Math.random() + '&' + encodeURIComponent(params), true); 
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
          if(req.status == 200) {
                text = req.responseText;
            } 
        }
    };
    req.send(null);
    //alert(text);
    return text;
}

И наконец код Perl программы, он довольно таки прост, выводит текущую дату и время.
Код

#!/usr/bin/perl
my $tm = localtime;

print "Content-Type: text/plain\n\n";
print $tm;

Проблема в том, что при нажатии на кнопку, ничего не выводится в <div>, но если раскоментировать alert в .js файле, в функции getServerSideText(), то показывается окно alert пустое, но зато после его закрытия в div появляется полученная строка. Подскажите, в чём проблема???? Как избавиться от alert, а результат просто вывести в <div>?

Заранее благодарен.

Автор: ksnk 14.11.2007, 09:35
Это тест на сообразительность? Или действительно комодератору этого форума нужно объяснять, что сам факт посылки реквеста (...send()) не означает его моментального исполнения?

С алертом получается так, что за время, пока алерт показывается, этот самый реквест успевает выполнится...

Добавлено через 5 минут и 17 секунд
Каким-то решением проблемы было бы изменить все вот так:
Код

        function getTxt() {
            getServerSideText('/cgi-bin','test.pl','',function(txt){document.getElementById('txt').innerHTML = txt});
        }



соответственно, в getServerSideText добавлен параметр callback  
Код

function getServerSideText(path, fileName, params,callback ) {
    var req = createXmlHttpRequest();
    req.open('GET', path + '/' + fileName + '?r=' + Math.random() + '&' + encodeURIComponent(params), true); 
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
          if(req.status == 200) {
               callback( req.responseText); // 
            } 
        }
    };
    req.send(null);
}

Автор: korob2001 14.11.2007, 19:43
Цитата(ksnk @  14.11.2007,  06:35 Найти цитируемый пост)
Это тест на сообразительность? Или действительно комодератору этого форума нужно объяснять, что сам факт посылки реквеста (...send()) не означает его моментального исполнения?

Эх ksnk, ты так говоришь, вроде я модератор раздела JavaScript и вот я пришёл и гружу тебя своими детскими вопросами. Кстати, паскаля я не знаю вообще, да и не только паскаля.  smile 

Ну а вообще спасибо за помощь, действительно помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)