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

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

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

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

<a href="http://mysite.com/projects/article-1" class="get-article">link</a>

Я возьму URL-адрес по ссылке:

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

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

window.location = path;

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


person laukok    schedule 25.06.2011    source источник
comment
обратите внимание, что Gmail - лучший пример того, что вы ищете   -  person alfred    schedule 17.10.2012
comment
Другой возможный дубликат: stackoverflow.com / questions / 824349 /   -  person morja    schedule 21.12.2012


Ответы (7)


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

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

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


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

  1. история браузера запомнит каждый сделанный вами шаг (так как URL + хеш изменился)
  2. у вас может быть адрес, который ссылается не только на конкретный 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 для продвинутых задач.

person david    schedule 25.06.2011
comment
Метод Брендана работает, если вы используете тот же домен. - person TERMtm; 14.05.2012
comment
Chrome и Safari представили поддержку history.pushState() в 2010 году, поэтому этот ответ был не совсем правильным, даже когда был написан. IE - последний крупный браузер, не поддерживающий history.pushState(), и ожидается, что это изменится в IE 10. - person Brilliand; 23.06.2012

См. Здесь - 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, и он работал нормально.

person Brendan    schedule 10.03.2012
comment
IE ‹10 не поддерживает это. - person Amyth; 28.10.2013
comment
Если вы не хотите фактически изменять историю и изменять только URL-адрес, вы должны использовать history.replaceState ('data', '', 'ваш-домен / путь '); вместо - person Radek Pech; 07.01.2014
comment
Это происходит из HTML5 API - person Pierre-Olivier Pignon; 09.01.2014
comment
спасибо за обмен знаниями;) - person webmaster; 03.08.2014

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

var fragment = location.hash;

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

location.hash = "your_state_data";
person Richard H    schedule 25.06.2011

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

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

window.location.hash = 'something';

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

person Jon    schedule 25.06.2011

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

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

window.location.hash = "/2131/"
person bevacqua    schedule 25.06.2011

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

person vcsjones    schedule 25.06.2011

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

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

ps. запретить onclick перенаправление ссылки по умолчанию, например:

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