Jquery: изменить адрес URL без перенаправления?

Возможный дубликат:
Изменить URL адресной строки в приложении AJAX для соответствия текущему состоянию

Как изменить URL-адрес без перенаправления страницы?

Например, когда я нажимаю на эту ссылку ниже:

<a href="#" onclick="location.href='http://mysite.com/projects/article-1'; return false;" class="get-article">link</a>

Я возьму URL из ссылки:

var path = object.attr('href');

Если я сделаю это ниже, страница будет перенаправлена:

window.location = path;

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

Ответ 1

ПРИМЕЧАНИЕ: history.pushState() теперь поддерживается - см. другие ответы.

Вы не можете изменить весь URL-адрес без перенаправления, вместо этого вы можете изменить хеш.

hash - это часть URL-адреса, которая идет после символа #. Первоначально это предназначалось для того, чтобы направить вас (локально) на разделы вашего HTML-документа, но вы можете прочитать и изменить его через javascript, чтобы использовать его как глобальную переменную.


При применении хорошо, этот метод полезен двумя способами:

  • история браузера будет помнить каждый другой шаг, который вы сделали (поскольку изменился URL + хэш)
  • у вас может быть адрес, который ссылается не только на конкретный html-документ, но также дает вашему javascript подсказку о том, что делать. Это означает, что вы в конечном итоге указываете на состояние внутри своего веб-приложения.

Чтобы изменить хеш, вы можете сделать:

document.location.hash = "show_picture";

Чтобы следить за изменениями хэша, вам нужно сделать что-то вроде:

window.onhashchange = function(){
    var what_to_do = document.location.hash;    
    if (what_to_do=="#show_picture")
        show_picture();
}

Конечно, хеш - это всего лишь строка, поэтому вы можете делать то, что вам нравится. Например, вы можете поместить туда целый объект, если вы используете JSON для его форматирования.

Есть очень хорошие библиотеки JQuery, чтобы делать с ними дополнительные вещи.

Ответ 2

Смотрите здесь - http://my.opera.com/community/forums/topic.dml?id=1319992&t=1331393279&page=1#comment11751402

По существу:

history.pushState('data', '', 'http://your-domain/path');

Вы можете манипулировать объектом истории, чтобы сделать эту работу.

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

Очевидно, что нужно будет проверять кросс-браузер, но поскольку это было опубликовано на форуме Opera, я уверен, что он будет работать в Opera, и я просто протестировал его в Chrome, и он работал нормально.

Ответ 3

Этот сайт использует фрагментарную часть URL-адреса: материал после "#". Это не отправляется на сервер браузером как часть запроса GET, но может использоваться для хранения состояния страницы. Поэтому да, вы можете изменить фрагмент, не вызывая обновление или перезагрузку страницы. Когда страница загружается, ваш javascript считывает этот фрагмент и соответствующим образом обновляет содержимое страницы, получая данные с сервера с помощью ajax-запросов по мере необходимости. Чтобы прочитать фрагмент в js:

var fragment = location.hash;

но обратите внимание, что это значение будет включать символ "#" в начале. Чтобы установить фрагмент:

location.hash = "your_state_data";

Ответ 4

Вы не можете делать то, что вы просите (и связанный сайт не делает то же самое).

Однако вы можете изменить часть URL-адреса после знака #, который называется фрагментом, например:

window.location.hash = 'something';

Фрагменты не отправляются на сервер (так, например, сам Google не может определить разницу между http://www.google.com/ и http://www.google.com/#something), но они могут быть прочитаны Javascript на вашей странице, В свою очередь, этот Javascript может решить выполнить другой запрос AJAX, основанный на значении фрагмента, как это делает сайт, с которым вы связаны.

Ответ 5

Это достигается путем перезаписи URL-адресов, а не с помощью обфускации URL-адресов, что невозможно.

Другой способ сделать это, как уже упоминалось, - это изменить хэштегов с помощью

window.location.hash = "/2131/"

Ответ 6

Нет, потому что это откроет шлюзы для фишинга. Единственной частью URI, которую вы можете изменить, является фрагмент (все после #). Вы можете сделать это, установив window.location.hash.

Ответ 7

Вы не можете изменить весь URL-адрес на панели адресов без перенаправления (подумайте об проблемах безопасности!).

Однако вы можете изменить часть hash (что после #) и прочитать: location.hash

ps. предотвратить перенаправление ссылки onclick по ссылке:

$("#link").bind("click",function(e){
  doRedirectFunction();
  e.preventDefault();
})