Forum Webscript.Ru

Программирование => JavaScript & JScript => Тема начата: Anthony от 27 Июня 2006, 23:02:42

Название: XMLHttpRequest
Отправлено: Anthony от 27 Июня 2006, 23:02:42
День добрый!

Совершенно неожиданно наступил на такие грабли: на сайте есть табличка с данными, которые обновлются посредством XMLHttpRequest, когда пользователь нажимает на кнопочку. Через некоторое время ИЕ вылетает с системной ошибкой. В Firefox все работает стабильно.

Кто-нибудь сталкивался с подобной проблемой? Ниже привожу код скрипта:


function get_http(){
    var xmlhttp;

    if (window.XMLHttpRequest)
{
try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false; }
    }
else if (window.ActiveXObject)
{
try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { xmlhttp = false; }
    }
    return xmlhttp;
}

function ch_tbl_section()
{
if(!this.http)
{
this.http = get_http();
this.working = false;
}

if (!this.working && this.http)
{
var http = this.http;

url = .....;

this.http.open("GET", url, true);
this.http.onreadystatechange = function()
{
if (http.readyState == 4)
{
...
}
}
this.http.send(null);
}
if(!this.http) alert(\'Ошибка XMLHTTP!\');
}
Название: XMLHttpRequest
Отправлено: vasa_c от 28 Июня 2006, 12:03:35
Что за ошибка?
В каком контексте выполняются эти функции?
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 12:16:47
Ошибка системная "Приносим свои извинения, приложение будет закрыто. Отправить отчет?" точный текст не помню.

Контекст. Ну я в принципе написал в самом начале. Пользователь жмет на кнопку "Обновить", вызывается функция ch_tbl_section(), которая посылает запрос на сервер. С сервера возвращается строка с данными, которая потом парсится, согдается табличка и после этого уже на страничке старая заменяется новой.

Ошибка вылезает только в ИЕ после нескольких обновлений.
Название: XMLHttpRequest
Отправлено: vasa_c от 28 Июня 2006, 12:22:04
Т.е. ch_tbl_section() не как метод объекта вызывается? Зачем тогда this?
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 12:32:58
Честно говоря понятия не имею ;) Код писал не я, а разбираться приходится.

У меня тоже сначала возник подобный вопрос, думаю это один из вариантов работы с глобальными переменными без их объявления вне функции.
Название: XMLHttpRequest
Отправлено: vasa_c от 28 Июня 2006, 12:43:45
Кривой вариант.
Разберись все-таки на что this указывает и как все вызывается.
В IE насколько я знаю он указывает не всегда на то, на что должен по документации указывать. Возможно из-за этого ошибка.
Так же посмотри на изменение свободной памяти в системе после каждого обновления в IE (если слетает не после первого).

Как на кнопку "обновить" обработчик вешается?
Первые обновления в IE (до сбоя) нормально работают?
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 12:50:54
Попробую.

На что this указывает... даже и не знаю, в принципе я привел практически весь код скрипта, только парсер выкинул. Попробую переделать на глобальные переменные.
Название: XMLHttpRequest
Отправлено: vasa_c от 28 Июня 2006, 12:54:50
В обработчике onreadystatechange this не используется?
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 12:59:54
Я только одно событие обрабатываю - onclick
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 13:03:38
А, понял. Нет, не используется. Ну разве что в конце стоит this.working = false;


        this.http.onreadystatechange = function()
        {
            if (http.readyState == 4)
            {
                ...
                this.working = false;
            }
        }
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 13:53:33
Так, переделал на глобальные переменные. И в самое начало добавил xmlworking = true;.

Виснуть вроде перестало. Но вылез совсем странный глюк - после очередного обновления по всему экрану псевдографика вылезла. Такое ощущение, что в обработчике глюк, хотя там ломаться-то нечему. removeChild(tbl_body) - удаляем старые данные, дальше серией createElement() создаем новую таблицу и в конце appendChild(tbl_body) добавляет новую таблицу на страницу.


function ch_tbl_section()
{
    if(!http)
    {
        http = get_http();
        xmlworking = false;
    }

    if (!xmlworking && http)
    {
        xmlworking = true;
       
        url = .....;

        http.open("GET", url, true);
        http.onreadystatechange = function()
        {
            if (http.readyState == 4)
            {
                ...
                xmlworking = false;
            }
        }
        http.send(null);
    }
    if(!http) alert(\'Ошибка XMLHTTP!\');
}
Название: XMLHttpRequest
Отправлено: vasa_c от 28 Июня 2006, 14:59:26
Опять this в конце
Название: XMLHttpRequest
Отправлено: Anthony от 28 Июня 2006, 15:03:00
да нет, все ок. Я просто когда сюда писал ошибся. На сайте в правильно