AJAX получает данные с большой HTML-страницы при загрузке большой HTML-страницы - PullRequest
1 голос
/ 03 июня 2010

Не совсем уверен, есть ли у этого имя, но в основном у меня есть большая HTML-страница, которая генерируется из результатов в БД.

Таким образом, просмотр страницы HTML (которая представляет собой отчет) непосредственно в браузере не сразу отображает все содержимое, но отображает его содержимое и добавляет дополнительный HTML при получении результатов из БД ...

Есть ли способ, которым я могу сделать AJAX-запрос к этой HTML-странице, и в отличие от ожидания, пока вся страница (отчет) не будет готова, я могу начать обработку ответа при загрузке отчета HTML? Или есть другой способ сделать это?

Атм Я делаю свой ответ AJAX, он просто сидит там в течение минуты или двух, пока страница HTML не будет заполнена ...

Если контекст имеет какое-либо применение: отчет HTML генерируется сервлетом Java, а страница, выполняющая вызов AJAX, является страницей JSP. К сожалению, я не могу очень легко разбить отчет, потому что он генерируется BIRT (расширение для отчетов Eclipse).

Заранее спасибо.

1 Ответ

1 голос
/ 03 июня 2010

Да, все работает, если кому-то интересно:

client.open("GET", reportUrl, true);
client.onreadystatechange = responseListener;
client.send();

var reportContents = document.getElementById("reportContents");
// Since this could considerably slow browsers for large reports,
// don't edit report contents for every readystate equal to 3.
// Do it every 10.
var batchUpdate = 10;
var responsesSinceUpdate = 0;
// Don't update the whole contents, just add the new stuff
// since the last update.
var currentLengthOfReportHtml = 0;
// Have max recommended length of report before showing warning.
var maxRecommendedReportLength = 500000;

function responseListener()
{
    if (this.status == 200)
    {
        var readyState = this.readyState;

        if (readyState == 3 || readyState == 4)
        {
            var updatePage = false;

            if (readyState == 4)
            {
                updatePage = true;
                var loadingDiv = document.getElementById("reportLoading");
                loadingDiv.innerHTML = "";
                toggleLargeReportWarning(false);
            }
            else
            {
                responsesSinceUpdate++;

                if (responsesSinceUpdate > batchUpdate)
                {
                    updatePage = true;
                    responsesSinceUpdate = 0;
                }
            }

            if (updatePage)
            {
                var reportLength = this.responseText.length;
                reportContents.innerHTML += this.responseText.substring(currentLengthOfReportHtml);
                currentLengthOfReportHtml = reportLength;

                if (reportLength > maxRecommendedReportLength && readyState == 3)
                {
                    toggleLargeReportWarning(true);
                }
            }
        }
    }
}
...