Как Gmail заставляет IE Назад работать без обновления?

Я принял ответ НЕУКРОТИМОЙ СТРЕЛЬБЫ ПО ТАРЕЛОЧКАМ, пока кто-то от Microsoft не приезжает для заливки холодной воды на идее. Но я не соглашаюсь с частью дела вкуса - конечно, корректный компилятор более важен, чем полный, но компилятор C# уже очень умен в разбирании в этом преобразовании для нас, насколько это делает. Немного больше полноты в этом случае сделало бы язык легче использовать, преподавать, объяснить, с меньшим количеством пограничных случаев или глюков. Таким образом, я думаю, что это стоило бы дополнительного усилия. Несколько парней в Редмонде царапают головы в течение двух недель, и в результате миллионы кодеров за следующее десятилетие могут ослабиться немного больше.

(я также питаю противное требование там, чтобы быть способом сделать yield return, выдают исключение, которое было наполнено в конечный автомат "с внешней стороны", кодом, управляющим повторением. Но мои причины желания этого довольно неясны.)

На самом деле один запрос, который я имею об ответе Jon, относится к броску выражения возврата урожая.

, Очевидно, возврат урожая 10 не так плох. Но это было бы плохо:

yield return File.ReadAllText("c:\\missing.txt").Length;

Так не был бы он иметь больше смысла оценивать эту внутреннюю часть предыдущий блок попытки/выгоды:

case just_before_try_state:
    try
    {
        Console.WriteLine("a");
        __current = File.ReadAllText("c:\\missing.txt").Length;
    }
    catch (Something e)
    {
        CatchBlock();
        goto case post;
    }
    return true;

следующая проблема была бы вложена блоки попытки/выгоды и повторно брошенные исключения:

try
{
    Console.WriteLine("x");

    try
    {
        Console.WriteLine("a");
        yield return 10;
        Console.WriteLine("b");
    }
    catch (Something e)
    {
        Console.WriteLine("y");

        if ((DateTime.Now.Second % 2) == 0)
            throw;
    }
}
catch (Something e)
{
    Console.WriteLine("Catch block");
}
Console.WriteLine("Post");

, Но я уверен, что это возможно...

16
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

3
ответ дан 30 November 2019 в 22:43
поделиться

Я могу дать вам ответ на этот вопрос, потому что я столкнулся с этой проблемой и решил ее.

Здесь необходимо сначала понять несколько концепций:

  1. javascript не может изменить браузер история напрямую.
  2. всякий раз, когда изменяется базовый URL-адрес iframe на странице, история обновляется. (но это имеет некоторые особенности в разных браузерах).
  3. URL-адрес имеет "хешированную" часть: например, в URL http://mail.google.com/mail#inbox , ] #inbox - хешированная часть. Назовем это "хешем". поэтому http://mail.google.com/mail будет нашим «базовым URL».

История отслеживания с помощью GMail в основном выполняется с помощью уловок, основанных на этом «хеш-коде».

Итак, еще несколько концепций:

  1. когда URL-адрес в адресной строке изменяется, история обновляется (предыдущий URL попадает в историю)
  2. при изменении базового URL страница перезагружается.
  3. когда хэш-часть URL изменяется без изменения базового URL, страница не перезагружается .

Итак, когда вы переходите с http://mail.google.com/mail#inbox на http://mail.google.com/mail#sent , страница не обновляется .

Теперь, если GMail должен был получать уведомление о событии при изменении хэша, то gmail мог бы предпринимать действия на основе этого. К сожалению, нет событий DOM, которые могут помочь нам фиксировать действия в истории. Поэтому вместо этого (это часть, которая показывает, как я преодолел проблему), мы запускаем бесконечный цикл, который проверяет наличие изменений в хэше. Если он замечает изменение, мы обнаруживаем нажатие кнопки «назад» или «вперед» в браузере.

Чтобы решить эту проблему, я создал удобный инструмент: парсер URL . Он может анализировать параметры GET в URL-адресе, а также параметры, закодированные в Hash. Попробуйте демо-версию

Ура!


Об этой проблеме в IE: Я не понимал, что это решение на основе хэша не работает в IE (бедный старый разработчик Linux).

Но для IE вы можете использовать скрытый iframe и использовать его свойство «URL-адрес влияет на историю» для реализации истории. Я знаю, что в этом утверждении нет подробностей, но это связано с моим собственным отсутствием опыта работы с IE.

Я попробую это решение и продолжу:)

Я нашел множество ссылок в Интернете, которые соответствуют правильным реализациям истории с использованием iframe / хэша местоположения. У меня не хватило терпения докопаться до различий между интерфейсом iframe в разных браузерах.

Думаю, я ' Я предпочитаю плагин jquery . У YUI тоже есть менеджер истории.

Ура!

13
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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