Forum Webscript.Ru
Программирование => JavaScript & JScript => Тема начата: 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!\');
}
-
Что за ошибка?
В каком контексте выполняются эти функции?
-
Ошибка системная "Приносим свои извинения, приложение будет закрыто. Отправить отчет?" точный текст не помню.
Контекст. Ну я в принципе написал в самом начале. Пользователь жмет на кнопку "Обновить", вызывается функция ch_tbl_section(), которая посылает запрос на сервер. С сервера возвращается строка с данными, которая потом парсится, согдается табличка и после этого уже на страничке старая заменяется новой.
Ошибка вылезает только в ИЕ после нескольких обновлений.
-
Т.е. ch_tbl_section() не как метод объекта вызывается? Зачем тогда this?
-
Честно говоря понятия не имею ;) Код писал не я, а разбираться приходится.
У меня тоже сначала возник подобный вопрос, думаю это один из вариантов работы с глобальными переменными без их объявления вне функции.
-
Кривой вариант.
Разберись все-таки на что this указывает и как все вызывается.
В IE насколько я знаю он указывает не всегда на то, на что должен по документации указывать. Возможно из-за этого ошибка.
Так же посмотри на изменение свободной памяти в системе после каждого обновления в IE (если слетает не после первого).
Как на кнопку "обновить" обработчик вешается?
Первые обновления в IE (до сбоя) нормально работают?
-
Попробую.
На что this указывает... даже и не знаю, в принципе я привел практически весь код скрипта, только парсер выкинул. Попробую переделать на глобальные переменные.
-
В обработчике onreadystatechange this не используется?
-
Я только одно событие обрабатываю - onclick
-
А, понял. Нет, не используется. Ну разве что в конце стоит this.working = false;
this.http.onreadystatechange = function()
{
if (http.readyState == 4)
{
...
this.working = false;
}
}
-
Так, переделал на глобальные переменные. И в самое начало добавил 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!\');
}
-
Опять this в конце
-
да нет, все ок. Я просто когда сюда писал ошибся. На сайте в правильно