Можно ли изменить URL-адрес текущей страницы без перезагрузки страницы?
Я хотел бы получить доступ к части до # хеша, если это возможно.
Мне нужно изменить часть после домена, поэтому его не так, как будто я нарушаю междоменные политики.
window.location.href = "www.mysite.com/page2.php"; // sadly this reloads
Теперь это можно сделать в браузерах Chrome, Safari, FF4 + и IE10pp4 +!
См. этот вопрос для получения дополнительной информации: Обновление адресной строки с новым URL без хэша или перезагрузка страницы
Пример:
function processAjaxData(response, urlPath){
document.getElementById("content").innerHTML = response.html;
document.title = response.pageTitle;
window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
}
Затем вы можете использовать window.onpopstate
для обнаружения навигации по кнопке назад/вперед:
window.onpopstate = function(e){
if(e.state){
document.getElementById("content").innerHTML = e.state.html;
document.title = e.state.pageTitle;
}
};
Для более глубокого изучения управления историей браузера см. эту статью MDN.
HTML5 представил history.pushState()
и history.replaceState()
, которые позволяют добавлять и изменять записи истории соответственно.
window.history.pushState('page2', 'Title', '/page2.php');
Подробнее об этом от здесь
file:///
по соображениям безопасности, например, Firefox 30. Тест на localhost
python -m SimpleHTTPServer
с помощью python -m SimpleHTTPServer
.
Вы также можете использовать HTML5 replaceState, если хотите изменить URL-адрес, но не хотите добавлять запись в историю браузера:
if (window.history.replaceState) {
//prevents browser from storing history with each change:
window.history.replaceState(statedata, title, url);
}
Это "сломает" функциональность кнопки "Назад". Это может потребоваться в некоторых случаях, например, в галерее изображений (где вы хотите, чтобы обратная кнопка возвращалась обратно на индексную страницу галереи, вместо того чтобы перемещаться по каждому просматриваемому вами изображению), предоставляя каждому изображению свой собственный уникальный URL-адрес.
ПРИМЕЧАНИЕ. Если вы работаете с браузером HTML5
вам следует игнорировать этот ответ. Теперь это возможно, как видно из других ответов.
Невозможно изменить URL
в браузере без перезагрузки страницы. URL-адрес представляет собой последнюю загруженную страницу. Если вы измените его (document.location
), он перезагрузит страницу.
Одной из очевидных причин является то, что вы пишете сайт на www.mysite.com
который выглядит как страница входа в банк. Затем вы изменяете строку браузера на www.mybank.com
. Пользователь будет совершенно не знать, что он действительно смотрит на www.mysite.com
.
parent.location.hash = "hello";
Вот мое решение: (newUrl - это ваш новый URL-адрес, который вы хотите заменить существующим)
history.pushState({}, null, newUrl);
HTML5 replaceState - это ответ, как уже упоминалось Vivart и geo1701. Однако он не поддерживается во всех браузерах/версиях. History.js обертывает функции состояния HTML5 и предоставляет дополнительную поддержку браузерам HTML4.
До HTML5 мы можем использовать:
parent.location.hash = "hello";
и
window.location.replace("http:www.example.com");
Этот метод перезагрузит вашу страницу, но HTML5 представил history.pushState(page, caption, replace_url)
, который не должен перезагружать вашу страницу.
history.pushState(..)
заключается в том, что если вы хотите перенаправить на другой домен, вступает в силу междоменная политика. При использовании window.location.replace(..)
перенаправление на другой домен.
Если вы пытаетесь разрешить пользователям делать закладки на страницы и делиться ими, и вам не нужен именно правильный URL, и вы не используете хэш-привязки для чего-либо еще, то вы можете сделать это за два части; Вы используете расположение.hash, рассмотренное выше, а затем реализуете проверку на домашней странице, чтобы найти URL с привязкой к хешу и перенаправить вас к последующему результату.
Например:
1) Пользователь находится на www.site.com/section/page/4
2) Пользователь выполняет действие, которое изменяет URL-адрес на www.site.com/#/section/page/6
(с хешем). Допустим, вы загрузили на страницу правильный контент для страницы 6, поэтому, кроме хеша, пользователь не слишком обеспокоен.
3) Пользователь передает этот URL кому-то другому или добавляет в закладки
4) Кто-то другой или тот же пользователь позднее перейдет на сайт www.site.com/#/section/page/6
5) Код на www.site.com/
перенаправляет пользователя на www.site.com/section/page/6
, используя что-то вроде этого:
if (window.location.hash.length > 0){
window.location = window.location.hash.substring(1);
}
Надеюсь, что это имеет смысл! Это полезный подход для некоторых ситуаций.
В современных браузерах и HTML5 в history
окон есть метод pushState
. Это изменит URL-адрес и добавит его в историю без загрузки страницы.
Вы можете использовать его следующим образом: 3) 1) состояние объекта 2) заголовок и URL):
window.history.pushState({page: "another"}, "another page", "example.html");
Это изменит URL, но не перезагрузит страницу, а также не проверит, существует ли страница, поэтому, если вы делаете некоторый код JavaScript, который реагирует на URL, вы можете работать с ними следующим образом.
Также есть history.replaceState()
которая делает то же самое, за исключением того, что она будет изменять текущую историю вместо создания новой!
Также вы можете создать функцию для проверки существования history.pushState, а затем продолжить работу с остальными, как это:
function goTo(page, title, url) {
if ("undefined" !== typeof history.pushState) {
history.pushState({page: page}, title, url);
} else {
window.location.assign(url);
}
}
goTo("another page", "example", 'example.html');
Также вы можете изменить #
для <HTML5 browsers
, которые не будут перезагружать страницу, что Angular
использует для SPA
соответствии с хэштегом...
Изменить #
довольно просто, сделав так:
window.location.hash = "example";
и вы можете обнаружить это так:
window.onhashchange = function () {
console.log("#changed", window.location.hash);
}
window.onhashchange
ли window.onhashchange
и window.onpopstate
делать то же самое в этом случае?
Любые изменения loction (либо window.location
или document.location
) вызовут запрос на этот новый URL-адрес, если вы не просто изменяете фрагмент URL-адреса. Если вы измените URL-адрес, вы измените URL-адрес.
Использовать методы перезаписи URL-адресов на стороне сервера, например Apaches mod_rewrite, если вам не нравятся используемые вами URL-адреса.
Вы можете добавить метки привязки. Я использую это на своем сайте http://www.piano-chords.net/, чтобы отслеживать с помощью Google Analytics, что люди посещают на странице. Я просто добавляю якорный тег, а затем часть страницы, которую я хочу отслеживать.
var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);
Ниже приведена функция изменения URL-адреса без перезагрузки страницы. Он поддерживает только HTML5
function ChangeUrl(page, url) {
if (typeof (history.pushState) != "undefined") {
var obj = {Page: page, Url: url};
history.pushState(obj, obj.Page, obj.Url);
} else {
window.location.href = "homePage";
// alert("Browser does not support HTML5.");
}
}
ChangeUrl('Page1', 'homePage');
page
?
Как указано Thomas Stjernegaard Jeppesen, вы можете использовать History.js для изменения параметров URL, пока пользователь перемещается по вашим ссылкам и приложениям Ajax,
С тех пор прошло почти год, и History.js рос и стал более стабильным и кросс-браузерным. Теперь его можно использовать для управления состояниями истории в HTML5-совместимом, а также во многих браузерах с поддержкой HTML4. В этой демонстрации Вы можете увидеть пример того, как это работает (а также возможность попробовать свои функциональные возможности и ограничения.
Если вам нужна помощь в использовании и реализации этой библиотеки, я предлагаю вам ознакомиться с исходным кодом демонстрационной страницы: вы увидите, что это очень легко сделать.
Наконец, для подробного объяснения того, какие могут быть проблемы с использованием хэшей (и хешбангов), посмотрите эту ссылку от Benjamin Lupton.
Теперь вы можете сделать это в большинстве "современных" браузеров!
1) Вот оригинальная статья: -
HTML5: изменение URL-адреса браузера без обновления страницы.
Вы можете сделать это:
window.history.pushState("object or string", "Title", "/new-url");
Возможно, без использования хэшей, посмотрите на asual jQuery Address plugin:
Пример здесь.
Обратите внимание, что он будет использовать хэши в IE, для этого нет обходного пути.
Использовать history.pushState()
из HTML 5 API истории
ссылка для получения более подробной информации API истории HTML5
let stateObject = { foo: "bar" };
history.pushState(stateObject, "page 2", "newpage.html");
Вы можете увидеть здесь Обновление URL браузера без перезагрузки страницы
Используйте window.history.pushState("object or string", "Title", "/new-url")
, но он по-прежнему отправляет новый запрос на сервер
pushState
упоминается только 14 раз в других ответах!
Предполагая, что вы не пытаетесь сделать что-то злонамеренное, все, что вы хотели бы сделать с вашими собственными URL-адресами, может быть вызвано магией htaccess.