Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > прогресс загрузки, Ajax


Автор: omka 21.11.2008, 11:45
Подскажите плиз.
Столкнулся с такой проблемой:
Есть загрузчик. Он производит загрузку папок со всеми файлами в контекст сервера. Т.к. файлов может быть до нескольких тысяч, необходимо сделать индикацию прогресса загрузки (те через определённые промежутки времени процент загрузки обновляется). Обновление естественно Ajax. Написал скрипт (см. код ниже). Он работает, но только в FireFox. В IE6 есть трабл - данные отображаются только после первого обращения к серверу, на последующие запросы прогресс просто убирается со страницы. После дебага понял что дело в особенности ActiveX. req.responseText - ничего не возвращает.
Код

var req = null;
var area = null;
var READY_STATE_COMPLETE = 4;

function sendRequest(url, params, HttpMethod) {
    if (!HttpMethod) {
        HttpMethod = "GET";
    }
        initXMLHTTPRequest();
    if (req) {
        req.onreadystatechange = onReadyState;
        req.open(HttpMethod, url, true);
        req.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded");
        req.send(params);
    }
}

function initXMLHTTPRequest() {
    if (window.XMLHttpRequest) {
        try {
            req = new XMLHttpRequest();
        } catch (e){}
    } else if (window.ActiveXObject) {
        try {
            req = new ActiveXObject('Msxml2.XMLHTTP');
        } catch (e){
            try {
                req = new ActiveXObject('Microsoft.XMLHTTP');
            } catch (e){}
        }
    }
}

function onReadyState() {
    var ready = req.readyState;
    var data = "";
    if (ready == READY_STATE_COMPLETE) {
        // Чтение данных ответа
        data = req.responseText;
        toConsole(data);
    }
}

function toConsole(data) {
    if (area != null) {
        for(var i = 0; i < area.childNodes.length; i++){
            area.removeChild(area.childNodes[i]);
        }
        var newline = document.createElement("<div>");
        area.appendChild(newline);
            newline.innerHTML = data;
        }
}

function prepareData() {
    area = document.getElementById("progress");
    sendRequest("/project/action.do?progress");
}

function timer(){
    setTimeout("timer();", 5000);
    prepareData();
}


На onload страницы стоит вызов timer(). Она в свою очередь через каждые 5 сек. вызывает сама себя. Напомню что в FireFox всё работает без проблемм. В IE data = req.responseText; возвращает "".

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