Как изменить URL без перезагрузки страницы?

Можно ли изменить URL-адрес текущей страницы без перезагрузки страницы?

Я хотел бы получить доступ к части до # хеша, если это возможно.

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

 window.location.href = "www.mysite.com/page2.php";  // sadly this reloads
1913
05 мая '09 в 13:54
источник поделиться
20 ответов

Теперь это можно сделать в браузерах 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.

1702
28 июля '10 в 18:30
источник

HTML5 представил history.pushState() и history.replaceState(), которые позволяют добавлять и изменять записи истории соответственно.

window.history.pushState('page2', 'Title', '/page2.php');

Подробнее об этом от здесь

426
17 авг. '10 в 16:59
источник

Вы также можете использовать HTML5 replaceState, если хотите изменить URL-адрес, но не хотите добавлять запись в историю браузера:

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

Это "сломает" функциональность кнопки "Назад". Это может потребоваться в некоторых случаях, например, в галерее изображений (где вы хотите, чтобы обратная кнопка возвращалась обратно на индексную страницу галереи, вместо того чтобы перемещаться по каждому просматриваемому вами изображению), предоставляя каждому изображению свой собственный уникальный URL-адрес.

98
19 нояб. '12 в 13:32
источник

ПРИМЕЧАНИЕ. Если вы работаете с браузером HTML5 вам следует игнорировать этот ответ. Теперь это возможно, как видно из других ответов.

Невозможно изменить URL в браузере без перезагрузки страницы. URL-адрес представляет собой последнюю загруженную страницу. Если вы измените его (document.location), он перезагрузит страницу.

Одной из очевидных причин является то, что вы пишете сайт на www.mysite.com который выглядит как страница входа в банк. Затем вы изменяете строку браузера на www.mybank.com. Пользователь будет совершенно не знать, что он действительно смотрит на www.mysite.com.

98
05 мая '09 в 13:57
источник
parent.location.hash = "hello";
76
14 мая '09 в 1:14
источник

Вот мое решение: (newUrl - это ваш новый URL-адрес, который вы хотите заменить существующим)

history.pushState({}, null, newUrl);
56
10 июня '15 в 21:25
источник

HTML5 replaceState - это ответ, как уже упоминалось Vivart и geo1701. Однако он не поддерживается во всех браузерах/версиях. History.js обертывает функции состояния HTML5 и предоставляет дополнительную поддержку браузерам HTML4.

25
21 нояб. '12 в 14:09
источник

До HTML5 мы можем использовать:

parent.location.hash = "hello";

и

window.location.replace("http:www.example.com");

Этот метод перезагрузит вашу страницу, но HTML5 представил history.pushState(page, caption, replace_url), который не должен перезагружать вашу страницу.

21
24 янв. '14 в 11:49
источник

Если вы пытаетесь разрешить пользователям делать закладки на страницы и делиться ими, и вам не нужен именно правильный 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);
}

Надеюсь, что это имеет смысл! Это полезный подход для некоторых ситуаций.

18
19 апр. '11 в 14:43
источник

В современных браузерах и 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);
}
15
02 июля '17 в 11:03
источник

Любые изменения loction (либо window.location или document.location) вызовут запрос на этот новый URL-адрес, если вы не просто изменяете фрагмент URL-адреса. Если вы измените URL-адрес, вы измените URL-адрес.

Использовать методы перезаписи URL-адресов на стороне сервера, например Apaches mod_rewrite, если вам не нравятся используемые вами URL-адреса.

12
05 мая '09 в 13:58
источник

Вы можете добавить метки привязки. Я использую это на своем сайте http://www.piano-chords.net/, чтобы отслеживать с помощью Google Analytics, что люди посещают на странице. Я просто добавляю якорный тег, а затем часть страницы, которую я хочу отслеживать.

var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);
11
14 дек. '09 в 1:57
источник

Ниже приведена функция изменения 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');
10
27 окт. '15 в 11:33
источник

Как указано Thomas Stjernegaard Jeppesen, вы можете использовать History.js для изменения параметров URL, пока пользователь перемещается по вашим ссылкам и приложениям Ajax,

С тех пор прошло почти год, и History.js рос и стал более стабильным и кросс-браузерным. Теперь его можно использовать для управления состояниями истории в HTML5-совместимом, а также во многих браузерах с поддержкой HTML4. В этой демонстрации Вы можете увидеть пример того, как это работает (а также возможность попробовать свои функциональные возможности и ограничения.

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

Наконец, для подробного объяснения того, какие могут быть проблемы с использованием хэшей (и хешбангов), посмотрите эту ссылку от Benjamin Lupton.

7
05 сент. '13 в 16:55
источник

Теперь вы можете сделать это в большинстве "современных" браузеров!

1) Вот оригинальная статья: -

HTML5: изменение URL-адреса браузера без обновления страницы.

см. документы MDN.

Вы можете сделать это:

window.history.pushState("object or string", "Title", "/new-url");
6
03 дек. '17 в 1:11

Возможно, без использования хэшей, посмотрите на asual jQuery Address plugin:

Пример здесь.

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

4
18 февр. '12 в 12:37
источник

Использовать history.pushState() из HTML 5 API истории

ссылка для получения более подробной информации API истории HTML5

3
15 авг. '15 в 14:55
источник
    let stateObject = { foo: "bar" };
    history.pushState(stateObject, "page 2", "newpage.html");

Вы можете увидеть здесь Обновление URL браузера без перезагрузки страницы

-1
15 окт. '18 в 22:24
источник

Используйте window.history.pushState("object or string", "Title", "/new-url"), но он по-прежнему отправляет новый запрос на сервер

-5
13 июля '17 в 7:04
источник

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

-8
05 мая '09 в 15:23
источник

Посмотрите другие вопросы по меткам или Задайте вопрос