JavaScript: переход к новому URL-адресу без замены текущей страницы в истории (не window.location)

Я знаю, как использовать window.location. Проблема в том, что (по крайней мере, в FF) он стирает страницу, на которой вы находитесь, из истории. например, я на странице A, я перехожу к B, а window.location используется для отправки меня на C. Если на странице C я нажимаю назад, я оказываюсь на A, а не на B.

Есть ли другой способ перейти на другую страницу, не стирая текущую страницу из истории?

РЕДАКТИРОВАТЬ: этого не произойдет, если вы запустите код в Firebug.

Вот очень простая страница (да, я знаю, что код уродлив, это не настоящий код), которая показывает проблему:

<html>
<head><script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"> </script>
<body>  
<div class="foo"></div>
<a href="javascript:$('.foo').html('<scri'+'pt type=&quot;text/javascript&quot;>window.location = &quot;c.html&quot;</s'+'cript>');">b</a>

РЕДАКТИРОВАТЬ2: jQuery - это проблема, а setTimeout - это ответ. Я добавил свое решение ниже на тот случай, если кто-то еще столкнется с этим странным граничным случаем.

EDIT3: этот пример упрощен, чтобы его было легче тестировать. В реальном случае обработчик кликов делает вызов Ajax, который возвращает HTML, поэтому мы не можем упростить все, просто написав window.location = what. Код поступает с сервера, встроенный в HTML.


person Community    schedule 24.02.2010    source источник
comment
Было бы полезно, если бы вы разместили код, который вы используете, например. window.location = url или window.location.replace(url)   -  person Patrick McElhaney    schedule 24.02.2010
comment
Я пробовал оба. Тот же результат.   -  person noah    schedule 24.02.2010


Ответы (5)


setTimeout это ответ.

$(div).html('<script...> setTimeout(function() { window.location = url; },10); </script>');

Не имеет этой проблемы. Это должно быть как-то связано с тем, как jQuery выполняет встроенные скрипты (путем создания тега script в элементе head).

person noah    schedule 24.02.2010
comment
Вам обязательно нужно вставлять теги динамического скрипта из href тега A вот так? Интересно, есть ли другой, менее сложный способ сделать это, который также позволит избежать этой проблемы. - person Nicole; 25.02.2010
comment
??? Почему вы используете javascript для вставки html, который имеет тег script, содержащий javascript, который запускает таймер для запуска реального кода javascript? Почему бы вам не заменить все это просто window.location = url; ? ДА, вы МОЖЕТЕ повернуть налево 3 раза, чтобы повернуть направо... но вы также можете просто повернуть направо. - person gregmac; 25.02.2010
comment
Да на самом деле. Вариант использования — динамическая загрузка HTML-контента, но если загрузка не удалась, нам нужно перенаправить, и логика для определения того, куда перенаправлять, находится на сервере, поэтому на самом деле это самый простой способ выполнить это. - person noah; 25.02.2010

Вы можете использовать window.location.assign(URL).

person Satyajit    schedule 24.02.2010

Я не вижу такого поведения в Firefox 3.6. Следуя вашему примеру, со stackoverflow.com я перешел на google.com, затем оттуда я использовал окно консоли Firebug для установки window.location = 'http://facebook.com». Оказавшись там, все три были в моей истории браузера.

person m4olivei    schedule 24.02.2010
comment
Я согласен, даже только на этом сайте... щелкните другую ссылку, затем в консоли firebug введите location = '/'; а затем нажмите назад (вы попадете на вторую страницу). Сравните это с теми же действиями, но набрав location.replace('/'); (переносит вас на эту страницу). - person gregmac; 24.02.2010
comment
Да, Firebug его не запускает. - person noah; 24.02.2010

Это всего лишь хак, и я не знаю, сработает ли он. Попробуйте window.history.back(1) после того, как вы установили URL-адрес с помощью window.location = URL;

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

person Raja    schedule 24.02.2010

Используйте location.href вместо местоположения.

person Robusto    schedule 24.02.2010