Поддельная загрузка / индикатор выполнения для медленной страницы, отличной от Ajax

Я разрабатываю сайт, который обслуживает некоторые медленные (время загрузки до 4 секунд) страницы из-за обширных запросов к базе данных.

Чтобы пользователи знали, что загружается новая страница (также для предотвращения множественных щелчков), я показываю div с фальшивой полосой загрузки на странице, где пользователи щелкнули ссылку на страницу с медленной загрузкой.

На самом деле, показ поддельного загрузочного div работает очень хорошо. DOM старой страницы (с фальшивой полосой загрузки) по-прежнему отображается при загрузке новой страницы, что означает, что загружаемый div отображается до тех пор, пока новая страница не будет готова к отображению.

Вот как это делается. HTML-часть:

<!-- link example which will execute the javascript -->
<a href="link/to/slow/page/" class="loading">slow page</a>

<!-- full screen div which gets displayed when clicking a
     "loading" class link. -->
<div id="dim" style="display:none; top:0; left:0; width:100%; height:100%; z-index:9999;">
    <div id="loading">
        <p>loading data, please wait...</p>
        <img src="loading.gif" alt="loading..." />
    </div>
</div>

Часть Javascript (jQuery):

$(".loading").each(function() {
    $(this).click(function() {
        $("#dim").fadeIn();
    });
    return true;
});

Проблема теперь заключается в том, что если пользователь снова щелкает в браузере (только что протестировано с помощью FF 3.6) с медленной страницы, div полосы загрузки все еще иногда отображается.

Вопросы:

  1. Это вообще хороший способ создать такую ​​фальшивую полосу загрузки?
  2. Если да, есть ли способ запретить браузерам отображать div при возврате в историю браузера?

Спасибо за любые подсказки.

Вывод:

похоже, нет простого способа подделать это таким образом. Я собираюсь получить данные Ajax с реальной полосой загрузки.


person Haes    schedule 26.07.2010    source источник
comment
Почему бы вам просто не оптимизировать запрос вместо того, чтобы пытаться обойти проблему и по-прежнему раздражать пользователей ожиданием?   -  person Andrew Bullock    schedule 26.07.2010
comment
Запросы и база данных уже оптимизированы для этого варианта использования, я не думаю, что есть много возможностей для улучшения. Это не имеет ничего общего с раздражением пользователей, напротив, я хочу показать им, что их запрос выполняется, чтобы они не нажимали несколько раз по такой ссылке.   -  person Haes    schedule 27.07.2010


Ответы (2)


Если бы ваш запрос был оптимизирован так, чтобы он не выполнялся так долго, вам не понадобился бы фальшивый индикатор выполнения.

Однако здесь вы имеете дело с кешем браузера, поэтому вы ничего не можете сделать, чтобы заставить браузер показывать или не показывать что-либо, если только не выполняется запрос страницы, когда они нажимают кнопку возврата.

По-настоящему хакерский способ сделать что-то - проверить в готовности к документу, виден ли #dim fadein, и сделать его невидимым.

Таким образом, когда происходит щелчок, он начинает отображаться, и если они нажимают кнопку «Назад», браузер отображает страницу, проверяет, видна ли она «в режиме онлайн», и просто убедитесь, что она невидима, если не нажата кнопка / ссылка.

person AcidRaZor    schedule 26.07.2010
comment
Вы правы, я не могу зависеть от браузера, что он будет отображать при возврате истории. Я, вероятно, оставлю это или получу данные через запросы Ajax. - person Haes; 27.07.2010

Есть ли много данных для отображения, следовательно, медленное извлечение данных? Если да, то как насчет сокращения набора данных, который вы изначально загружаете, и запроса последующих блоков данных с помощью запросов ajax?

person Drewid    schedule 26.07.2010
comment
Основным узким местом является запрос к базе данных, а не объем данных. Но спасибо за ответ, похоже, дешевого решения для этого нет. Я мог бы либо переключиться на получение данных через запросы Ajax, либо оставить все как есть. - person Haes; 27.07.2010