Как я могу обнаружить на стороне клиента, когда загрузка страницы является результатом точки истории AJAX?

Я пытаюсь предотвратить эффект «мерцания», возникающий на моей странице ASP.NET, который возникает, когда пользователь переходит на страницу с помощью кнопки «Назад» в браузере после перехода от нее. Причина мерцания заключается в том, что я использую панель обновлений, в которой есть некоторый контент при начальной загрузке страницы. В результате, когда страница загружается с помощью кнопки «Назад», исходное содержимое отображается очень кратко, прежде чем оно будет обновлено правильными данными с учетом истории.

Чтобы преодолеть это, я намерен скрыть панель обновлений (отображать: нет) при начальной загрузке страницы, а затем показывать ее, пока у нас нет истории, с которой нужно иметь дело. Проблема в том, что я не могу найти, что проверить, чтобы определить, есть ли какая-либо история. Я вижу, что у Sys.Application есть член _history, но когда я проверяю его на странице init, он каждый раз имеет значение null.

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


person Nick    schedule 25.05.2010    source источник


Ответы (3)


Кнопка «Назад» в браузере и предоставляемые ею функции совершенно не зависят от содержимого вашей веб-страницы.

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

location.hash = 'foo';
person Daniel Dyson    schedule 25.05.2010

Спасибо за ваш ответ Даниил. Теперь у меня есть div вокруг моей панели обновлений, для свойства display которого установлено значение none. В событии инициализации Sys.Application я проверяю значение window.location.hash, чтобы определить, является ли загрузка страницы результатом нажатия кнопки браузера назад/вперед. Если это не так, я устанавливаю свойство отображения на блокировку, если нет, я пока оставляю его как «отображение: нет».

На стороне сервера в обработчике событий ScriptManager Navigate, который вызывается в результате нажатия кнопки «Назад», я регистрирую блок клиентского скрипта, который устанавливает для свойства отображения значение block.

Я провел небольшое тестирование и, кажется, работает нормально, и у меня больше нет мерцания. Я бы предпочел использовать один из клиентских объектов MS AJAX для проверки истории, но это так.

person Nick    schedule 25.05.2010
comment
Это лучший способ сделать это: установить display:none при загрузке страницы (onBody). Это должно удовлетворить его. - person waqasahmed; 19.08.2010
comment
вы должны использовать комментарии, чтобы ответить людям, которые отвечают, или отредактировать исходный вопрос, указав дополнительные подробности на основе вопросов или отзывов других людей. Пожалуйста, не публикуйте обсуждение в виде отдельных ответов, если только это не фактический ответ на вашу проблему (вы решили ее самостоятельно). - person KP.; 01.09.2010

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

person ErikE    schedule 10.09.2010