Ajax, кнопка "Назад" и обновления DOM

Для ответа на вопрос рассмотрите этот вопрос: что будет ниже кода, распечатывают, когда эти Child объект инстанцируют?

class Parent
{
    public Parent()
    {
        DoSomething();
    }

    protected virtual void DoSomething() 
    {
    }
}

class Child : Parent
{
    private string foo;

    public Child() 
    { 
        foo = "HELLO"; 
    }

    protected override void DoSomething()
    {
        Console.WriteLine(foo.ToLower()); //NullReferenceException!?!
    }
}

ответ - то, что на самом деле NullReferenceException будет брошен, потому что foo является пустым. основного конструктора объекта вызывают перед его собственным конструктором . При наличии virtual вызов в конструкторе объекта Вы представляете возможность, что наследование объектов выполнит код, прежде чем они были полностью инициализированы.

112
задан BigBlondeViking 29 July 2009 в 13:18
поделиться

5 ответов

Один ответ: среди прочего, события выгрузки приводят к тому, что кеш обратного / прямого перехода становится недействительным .

Некоторые браузеры сохраняют текущее состояние всей веб-страницы в так называемый «bfcache» или «страничный кеш». Это позволяет им очень быстро повторно отображать страницу при навигации с помощью кнопок «назад» и «вперед» и сохраняет состояние модели DOM и всех переменных JavaScript. Однако, когда страница содержит события onunload, эти события могут потенциально перевести страницу в нефункциональное состояние, поэтому страница не сохраняется в bfcache и должна быть перезагружена (но может быть загружена из стандартного кеша) и повторно загружена. рендеринг с нуля, включая запуск всех обработчиков загрузки. При возврате на страницу через bfcache DOM сохраняется в своем предыдущем состоянии, без необходимости запускать обработчики onload (поскольку страница уже загружена).

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

jQuery автоматически прикрепляет событие выгрузки к окну, поэтому, к сожалению, использование jQuery не позволяет сохранить вашу страницу в bfcache для сохранения DOM и быстрого перехода назад / вперед . [Обновление: это было исправлено в jQuery 1.4, поэтому оно применимо только к IE]

105
ответ дан 24 November 2019 в 02:53
поделиться

Facebook запоминает состояние страницы, изменяя хэш-идентификатор в URL-адресе для запросов ajax. Эти изменения записываются в историю браузера, поэтому, когда пользователь нажимает кнопку «Назад», хеш изменяется на то, что было раньше. Таким образом, подразумевается, что вам понадобится некоторый Javascript для отслеживания идентификатора has и реакции на его изменение браузером. Андреас Бликст имеет доступный скрипт мониторинга хэшей .

3
ответ дан 24 November 2019 в 02:53
поделиться

Использование идентификатора хэша / фрагмента URL-адреса - довольно распространенный способ перехвата / запоминания состояния в веб-приложении, которое использует обновления Ajax и DOM.

Ознакомьтесь с Really Simple История проекта на несколько идей. Можно отслеживать URL-адрес на предмет изменений хэша, и rsh делает это с учетом различий в браузерах.

2
ответ дан 24 November 2019 в 02:53
поделиться

То, что вы ищете, - это какой-то тип управления хешем URL. # В URL-адресе предназначен только для клиентской стороны.

Когда вы меняете состояние задней панели с помощью JS, вы обновляете данные в # URL-адреса.

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

Взгляните на это:

http://ajaxpatterns.org/Unique_URLs

0
ответ дан 24 November 2019 в 02:53
поделиться

Это не имеет ничего общего с символом решетки (#).

Если вы проверите заголовки HTTP Apple, это просто кэширование страницы.

3
ответ дан 24 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: