javascript location.hash обновляется в IE - PullRequest
24 голосов
/ 08 апреля 2010

Мне нужно изменить хеш, удалить его после определенной обработки, чтобы при обновлении пользователь не вызывал повторный запуск процесса.

Это хорошо работает в FF, но кажется, что IE перезагружается каждый раз, когда я пытаюсь изменить хэш. Я думаю, что это связано с другими вещами, которые загружаются на странице, хотя я не уверен. У меня есть iframe, который загружает (связанный с процессом), а также некоторые сценарии, которые все еще выбираются в родительском окне.

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

Есть идеи, как это решить?

Более странное поведение: Хеш приходит из другого места в веб-приложении через перенаправление. Я обнаружил, что если я просто добавлю хеш вручную, добавив #myid к URL, он не будет перезагружен. Не имеет значения, введу ли я хэш на странице, которая уже загружена (добавив #myid к уже существующему URL), или введу полный URL в новой вкладке.

Ответы [ 9 ]

17 голосов
/ 20 июля 2010

Это похоже на ошибку в Internet Explorer (протестировано с 7 и 8).

Изменение window.location.hash не должно приводить к перезагрузке, и распространенным методом JavaScript является использование хеша для поддержания состояния.

Если вы вручную загрузите страницу и измените хеш с помощью JavaScript, она будет работать.

Проблема в том, что когда вы перенаправлены на страницу из другого места (т. Е. С помощью заголовка HTTP "Location"), изменение хеша приведет к перезагрузке.

Чтобы обойти эту ошибку, вы можете:

1) Если вы можете контролировать перенаправление, вы можете заменить заголовок Location некоторым HTML.

<html>
<head>
    <meta http-equiv="refresh" content="0; url=__REDIRECT_LOCATION__">
    <script>window.location = "__REDIRECT_LOCATION__";</script>
</head>
</html>

2) в противном случае вы можете попробовать перезагрузить страницу, когда она загружена. Чтобы предотвратить повторную загрузку, вам может потребоваться установить cookie.

window.location = window.location; // window.location.reload() didn't work.

In pseudo code: 

// if is Internet Explorer
//      if ( cookie "reloadPerformed" is not set )
//          set cookie "reloadPerformed" = "1"
//          reload page
//      else 
//          clear cookie "reloadPerformed"

Очевидным недостатком является то, что загрузка страницы приводит к двухстраничному запросу и рендерингу, поэтому вы захотите, чтобы перезагрузка была одной из первых вещей, которые страница делает при загрузке.

14 голосов
/ 27 сентября 2010

@ JarneCook кажется правильным - это ошибка в IE.

Вы можете просто сделать:

<script type="text/javascript">
  window.location.hash = window.location.hash;
</script>

вверху вашей страницы. В обычных обстоятельствах это должно быть запрещено, но если пользователь использует IE и прибыл через перенаправление, страница перезагрузится, прежде чем они даже заметят, что она загружена.

10 голосов
/ 13 мая 2010

Проблема в том, что " Хеш приходит из другого места в веб-приложении через перенаправление. ". Если вы используете javascript для перенаправления URL-адреса в клиенте следующим образом:

location.href = 'test1.aspx#testhash'

все будет хорошо!

Итак, это ошибка IE: когда веб-приложение через редирект, браузер может видеть только предыдущий URL, поэтому при изменении location.hash браузер видит изменение URL, поэтому обновляет страницу. *

1 голос
/ 07 января 2013

Столкнулся с этой проблемой, как предлагалось в одном из ответов, проблема была только при перенаправлении 302/301. Изменение хэша не перезагружается, если страница не была перенаправлена. Я перенаправлял с помощью PHP и не хотел использовать куки, чтобы остановить перенаправление.

Более того, эта проблема возникла и в некоторых браузерах IE9, пробовали 5 браузеров IE9, 4 перезагрузили страницу.

Вот исправление, добавленное в заголовок:

<!--[if lt IE 10]>
    <script type="text/javascript">
        if(window.location.hash.replace('#','').length > 0
            && window.location.hash.search('stopredirectioninie') == -1)
        {
            window.location.href = window.location.href+'&stopredirectioninie';
        }
    </script>
<![endif]-->
1 голос
/ 04 февраля 2011

Подобная проблема существовала в моем проекте. Но мы не могли использовать методы, описанные выше, потому что, когда IE обновлял страницу, предварительно загруженные данные были сброшены. Итак, мы воспользовались функцией браузера. Когда вы нажимаете на тег «a», сначала происходит событие onClick, а после браузера событий используется атрибут «href» для перенаправления. Когда IE использует href с хэшем для перенаправления, перезагрузки не существует. Таким образом, вы можете использовать событие onClick для запуска обработки на стороне сервера (например, __ doPostBack для asp.net), и когда обработка будет выполнена, браузер будет использовать атрибут «href» для перенаправления. Таким образом, новая страница не будет перезагружена. Также вы можете использовать window.location = yourNewLocationWithHash, вызывая после обработки на стороне сервера. Надеюсь это поможет =)

0 голосов
/ 07 мая 2014

У нас была такая же проблема.

В нашем случае это был http-адрес, который Apache перенаправил на https. Поскольку строка после знака хеша никогда не передается на сервер, она теряется.

0 голосов
/ 19 января 2012

Вот кросс-браузерные решения. Работает в IE, Chrome, Safari и FF (пробовал в последних версиях).

var pos = location.href.indexOf('c=');
location = (pos < 0 ?
                    location + (location.href.indexOf('?') < 0 ? '?' : '&')
                    : location.href.substring(0, pos))
           + 'c=' + Math.floor(Math.random()*11) + '#' + comment_id ;

По сути, я использую строку запроса ("?") Для запуска перезагрузки страницы с помощью хэша. Первая строка проверяет, есть ли наша «золотая» строка запроса (я использую переменную «c», что означает «комментарий»). Если есть,

  1. новый URL будет иметь все до этого "c =";
  2. затем добавляет наше золотое "c =" + случайное число от 0 до 10 + "#" + идентификатор моего комментария, к которому браузер должен перейти при перезагрузке.

Если нет,

  1. новый URL будет иметь все, что имел старый URL;
  2. если старый URL-адрес уже содержит какую-либо другую строку запроса (что-то после "?"), Добавьте оператор добавления запроса "&";
  3. если нет "?", То добавьте его;
  4. затем отправляется вышеупомянутый «золотой» запрос.

Причина, по которой я добавляю случайное число после "?" в том, что после первой перезагрузки появляется что-то вроде «? # comment-10». В этом случае при следующем изменении URL-адреса страница не будет перезагружена, поскольку браузер понимает ее как инструкцию перехода с привязки.

Для принудительной перезагрузки нам нужно добавить в запрос некоторую случайную вещь, чтобы новый URL отличался от предыдущего.

Это решение будет работать во всех браузерах и гарантирует, что перезагрузка не нарушит существующий запрос. Единственное примечание - убедиться, что ваше «золотое» имя переменной запроса уникально.

Надеюсь, это поможет.

0 голосов
/ 31 мая 2010

Если вы используете javascript для установки хэша, не используйте "#"

window.location.hash = '#foo'; //IE will reload the page
window.location.hash = 'foo'; //IE will set the hash but will not reload the page
0 голосов
/ 08 апреля 2010

Мне кажется, что если вы измените хеш, вы в основном измените расположение страницы, и поэтому IE (или любой другой браузер) перезагрузится. Как вы пытаетесь это сделать? window.location.hash = "";?

Возможно, Firefox достаточно умен, чтобы видеть, что вы делаете, и избегать обновления.

...