Подтвердить что ты не робот

Обновление javascript location.hash в IE

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

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

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

Любые идеи о том, как это решить?

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

4b9b3361

Ответ 1

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

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

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

Проблема заключается в том, что вы перенаправлены на страницу из другого места (то есть: используя HTTP-заголовок "Местоположение" ), а затем изменение хэша приведет к перезагрузке.

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

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"

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

Ответ 2

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

Возможно, вы сможете:

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

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

Ответ 3

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

location.href = 'test1.aspx#testhash'

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

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

Ответ 4

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

Ответ 5

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

Более того, эта проблема возникла в некоторых браузерах 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]-->

Ответ 6

Вот кросс-браузерные решения. Работает в 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", которая обозначает "комментарий" ). Если есть,

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

Если нет,

  • новый URL-адрес будет иметь все старые URL-адреса, которые были использованы;
  • Если старый URL-адрес уже содержит какую-либо другую строку запроса (что-то после "?" ), добавьте оператор добавления запроса "&";
  • если нет "?", добавьте его;
  • затем идет вышеупомянутый "золотой" запрос.

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

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

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

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

Ответ 7

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

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

Ответ 8

Если вы используете 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

Ответ 9

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

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