Тема: Допоможіть знайти помилку у коді.

Прочитавши декілька сторінок по ajax, вирішив попробувати на практиці.
Все має бути банально просто.
Є 3 файли:
st.php

Прихований текст
<?php
header('Content-Type: text/XML');
echo '  <?xml version="1.0"?>
  <clock>
  <timestring>'. date("H:i:s") .'</timestring>
  </clock>
';
?>

Він відповідає за формування xml
ajax.js

Прихований текст
function getXMLHTTPRequest()
{
    var req = false;
    try 
    {
        req = XMLHttpRequest();
    }
    catch(err)
    {
        try
        {
            req = new ActiveXObject("MSXML2.XMLHTTP");
        }
        catch(err)
        {
            try
            {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(err)
            {
                req = false
            }
        }
        
    }
    return req;
} 

function getServerTime()
{
    var theURL = 'st.php';
    myReq.open("GET", theURL, true);
    myReq.onreadystatechange = theHTTPResponse();
    myReq.send(null);
}

function theHTTPResponse()
{
    if(myReq.readyState == 4)
    {
        if(myReq.status == 200)
        {
            var timeString = myReq.responseXML.getElementsByTagName("timestring")[0];
            document.getElementById('showtime').innerHTML = timeString.childNodes[0].nodeValue;
        }
    }
    else
    {
        document.getElementById('showtime').innerHTML = 'Завантаження';
    }
}

Сам ajax лоадер.
index.html

Прихований текст
<html lang="uk" > 
<head>
<script src="ajax.js" type="text/JavaScript"></script>
<script type="text/JavaScript" >var myReq = getXMLHTTPRequest();</script>
</head>    
<body>
<div id="showtime" onmouseover="Javascript:getServerTime();">
     
</div>    
</body>    
</html>

Сам файл у якому повинно відображатися час сервера, який отримано за допомогою запиту.

Проблема у тому, що при завантаженні index.html - нічого не відображається.

2

Re: Допоможіть знайти помилку у коді.

Файрбаг сказав:

Uncaught TypeError: Object false has no method 'open' ajax.js:33

3

Re: Допоможіть знайти помилку у коді.

Я б вам радив використовувати jQuery $.load або $.ajax  + дуже корисна штука FireBug  в вашому випадку вкладка сеть особливо корисна тим не менше що я зробив щоб воно запрацювало.

Спочатку я поміняв стиль в контейнері а то в 1 піксель трошки було тяжко попадати :)
index.php

<!DOCTYPE html>    
<html>
    <head>
        <script src="ajax.js" type= "text/javascript"></script>
        <meta charset="utf-8">

          <script>
            var myReq = getXMLHTTPRequest();
        </script>
        
    </head>
    <body>

    <div id="showtime" onmouseover="javascript:getServerTime();" style="width: 100px; height: 100px; border: 1pt solid green;">
    </div>

      
    </body>
</html>

Потім чучуть поправив XML, була якась помилка в гуглі писало що скорше всього то через utf-8 bom але я просто стер перший рядок і воно перестало видавати помилку.
st.php

    <?php
    header('Content-Type: text/XML;');
    echo '
    <clock>
    <timestring>'. date("H:i:s") .'</timestring>
    </clock>
    ';
    ?>

І ще тут я щось поміняв якщо чесно я забув що :)
ajax.js

function getXMLHTTPRequest()
{
var req = false;
try
{
req = XMLHttpRequest();

}
catch(err)
{
try
{
req = new ActiveXObject("MSXML2.XMLHTTP");
}
catch(err)
{
try
{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(err)
{
req = false
}
}
}
return req;
}
 
function getServerTime()
{
var theURL = 'st.php';
myReq.onreadystatechange = theHTTPResponse();
myReq.open("GET", theURL, true);

myReq.send();
}

function theHTTPResponse() {
    if (myReq.readyState == 4) {
        if (myReq.status == 200) {
            var timeString = myReq.responseXML.getElementsByTagName("timestring")[0];
            document.getElementById('showtime').innerHTML = timeString.childNodes[0].nodeValue;
        }
    }
    else {
        document.getElementById('showtime').innerHTML = 'Завантаження';
    }
}

4

Re: Допоможіть знайти помилку у коді.

Спробуй це, в тебе була якась помилка при створенні об'єкту для аякс запитів.

function getXMLHTTPRequest() {
        var request_type;
        var browser = navigator.appName;
        if(browser == "Microsoft Internet Explorer"){
        request_type = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
        request_type = new XMLHttpRequest();
        }
        return request_type;
}

5

Re: Допоможіть знайти помилку у коді.

А мені здається там все нормально. Згрубша треба поміняти 33 і 34 рядок в оригінальному файлі щоб все працювало. Але нащо городити такі огороди з трай кетч для іе6, він того не достойний :)

Подякували: Voron1

6

Re: Допоможіть знайти помилку у коді.

truesupport написав:

А мені здається там все нормально. Згрубша треба поміняти 33 і 34 рядок в оригінальному файлі щоб все працювало. Але нащо городити такі огороди з трай кетч для іе6, він того не достойний :)

Коли клієнт напише вам що його сайт не працює в IE то ви ще не такі городи будете городити)))

Re: Допоможіть знайти помилку у коді.

Тепер почало працювати, але правда тільки наполовину.
Коли наводжу мишку на квадратик - вискакує надпис "Завантаження", але далі нічого не відбувається.

Re: Допоможіть знайти помилку у коді.

Patron написав:

Файрбаг сказав:

Uncaught TypeError: Object false has no method 'open' ajax.js:33

Пробував профіксити, запит до st.php проходить.

9

Re: Допоможіть знайти помилку у коді.

в пості №5 я мав на увазі поміняти місцями рядок 33 з 34 в файлі ajax.js. Помоєму після цього все працює як потрібно.

Re: Допоможіть знайти помилку у коді.

truesupport написав:

в пості №5 я мав на увазі поміняти місцями рядок 33 з 34 в файлі ajax.js. Помоєму після цього все працює як потрібно.

Дійсно допомогло.
Велике спасибі.

Re: Допоможіть знайти помилку у коді.

Зараз маю потребу використовувати ajax.
Але не можу зробити однієї штучки.
Справа у тому, що треба 2 рази навести мишкою на квадратик, щоб вивелась дата.
Як можна зроити так, що один раз навести і після того як дата отримана, слово "Завантаження"
замінялося на отриману дату ?