Як нам оновити URL-адреси або рядки запитів за допомогою javascript / jQuery без перезавантаження сторінки?


76

Чи є спосіб програмно оновити URL-адресу без перезавантаження сторінки?

EDIT: Я додав щось у заголовок у дописі. Я просто хочу пояснити, що не хочу перезавантажувати сторінку


Наведіть приклад того, чого ви намагаєтесь досягти.
Костянтин Дінев

Ви хочете змінити видиму URL-адресу (у адресному рядку) або рядок URL-адреси документа в DOM?
Моріс

@Maurice Я просто хочу змінити видиму URL-адресу
develoarvin

використовуйте window.history.replaceState (), як у цьому прикладі
Prasad De Silva

Відповіді:


40

Так - document.location = "http://my.new.url.com"

Ви також можете отримати його таким же способом, наприклад.

var myURL = document.location;
document.location = myURL + "?a=parameter";

Об'єкт розташування також має ряд корисних властивостей:

hash            Returns the anchor portion of a URL
host            Returns the hostname and port of a URL
hostname        Returns the hostname of a URL
href            Returns the entire URL
pathname        Returns the path name of a URL
port            Returns the port number the server uses for a URL
protocol        Returns the protocol of a URL
search          Returns the query portion of a URL

РЕДАГУВАТИ: Встановлення хешу документа. Location не повинно перезавантажувати сторінку, просто змініть, де на сторінці фокус. Тож оновлення до #myIdперейде до елемента за допомогою id="myId". Якщо idцього не існує, я вірю, що нічого не станеться? (Хоча потрібно підтвердити в різних браузерах)

EDIT2: Щоб це було зрозуміло, не лише в коментарі: Ви не можете оновити всю URL-адресу за допомогою JavaScript без зміни сторінки, це обмеження безпеки. В іншому випадку ви можете натиснути на посилання на випадкову сторінку, створену, щоб виглядати як gmail, і миттєво змінити URL-адресу на www.gmail.com і вкрасти дані для входу людей.
Ви можете змінити частину після домену в деяких браузерах, щоб справлятися зі стилями AJAX, але це вже пов’язано з Osiris. Більше того, ви, мабуть, не повинні цього робити, навіть якби могли. URL-адреса повідомляє користувачеві, де він перебуває на вашому сайті. Якщо ви зміните його, не змінюючи вміст сторінки, це стає трохи заплутаним.


1
Я дивлюся на оновлення всієї url-адреси, а не тільки хеш
файлів

4
Ви не можете оновити всю URL-адресу за допомогою JavaScript, не змінивши сторінку, це обмеження безпеки. В іншому випадку ви можете натиснути на посилання на випадкову сторінку і миттєво запропонувати URL-адресу сказати www.gmail.com та вкрасти логіни людей.
Matt Fellows

21
Налаштування document.locationперезавантажує сторінку.
Ален Тіембло

Дякую @AlainTiemblo - якщо ви прочитаєте повну відповідь, то побачите, що я це визнаю, з попередженнями, про які я вже заявив.
Matt Fellows

Хороше глибоке пояснення.
MH

93

Так і ні. Усі поширені веб-браузери мають запобіжний захід. Мета полягає в тому, щоб не дати людям створювати копії веб-сайтів, змінити URL-адресу, щоб вона виглядала правильно, а потім мати можливість обдурити людей та отримати їх інформацію.

Однак деякі веб-браузери, сумісні з HTML5, впровадили API історії, який можна використовувати для чогось подібного до того, що ви хочете:

if (history.pushState) {
    var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?myNewUrlQuery=1';
    window.history.pushState({path:newurl},'',newurl);
}

Я тестував, і це спрацювало нормально. Це не перезавантажує сторінку, але лише дозволяє змінити запит URL-адреси. Ви не зможете змінити протокол або значення хоста.

Для отримання додаткової інформації:

http://diveintohtml5.info/history.html

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history


Натискання кнопки "назад" призведе до видалення змін, але ідея мені подобається.
Ален Тіембло

Цей підхід не працює в деяких браузерах, оскільки window.location.pathnameмістить косу риску /, а значення результату може бути http://my.domain.com/?myNewUrlQuery=1замість http://my.domain.com?myNewUrlQuery=1.
pto3

7

Ви можете використовувати:

window.history.pushState('obj', 'newtitle', newUrlWithQueryString)

або window.history.replaceState ('obj', 'newtitle', newUrlWithQueryString), якщо ви не хочете, щоб зміна URL-адреси зберігалася в історії.
TamusJRoyce

4

Використовуйте

window.history.replaceState ({}, document.title, updatedUri);

Щоб оновити URL-адресу без перезавантаження сторінки

 var url = window.location.href;
 var urlParts = url.split('?');
 if (urlParts.length > 0) {
     var baseUrl = urlParts[0];
     var queryString = urlParts[1];

     //update queryString in here...I have added a new string at the end in this example
     var updatedQueryString = queryString + 'this_is_the_new_url' 

     var updatedUri = baseUrl + '?' + updatedQueryString;
     window.history.replaceState({}, document.title, updatedUri);
 }

Щоб видалити рядок запиту без перезавантаження сторінки

var url = window.location.href;
if (url.indexOf("?") > 0) {
     var updatedUri = url.substring(0, url.indexOf("?"));
     window.history.replaceState({}, document.title, updatedUri);
}

Я просто переглядав документацію Mozilla, бо window.history.replaceState()я не впевнений у тому, що роблять ці три параметри, чи можете ви це пояснити? Другий, конкретно document.title, здається, нічого не робить.
tfantina

replaceState()працює точно так, pushState()тому перевірте опис параметрів для pushState()методу . titleПараметр поки що ігнорується, але вони можуть використовувати його в майбутньому.
Prasad De Silva

3

Так

document.location - це звичайний спосіб.

Однак document.location фактично такий самий, як window.location, за винятком window.location трохи більше підтримується у старих браузерах, тому може бути кращим вибором.

Перегляньте цю тему на SO для отримання додаткової інформації:

Яка різниця між window.location та document.location в JavaScript?


2

Визначте новий об’єкт URL-адреси, призначте йому поточну URL-адресу, додайте параметри до цього об’єкта URL-адреси та, нарешті, переведіть його у стан вашого браузера.

var url = new URL(window.location.href);
//var url = new URL(window.location.origin + window.location.pathname) <- flush existing parameters
url.searchParams.append("order", orderId);
window.history.pushState(null, null, url);

1

Префікс URL-адреси змінюється хештегом, щоб уникнути перенаправлення.

Це переспрямовує

location.href += '&test='true';

Це не переспрямовує

location.href += '#&test='true';

0

Звичайний javascript: document.location = 'http://www.google.com';

Однак це призведе до оновлення браузера - розгляньте можливість використання хешів, якщо вам потрібно оновити URL-адресу, щоб реалізувати якусь історію перегляду без перезавантаження сторінки. Можливо, ви захочете заглянути в jQuery.hashchange, якщо це так.


1
Так, це спричиняє оновлення браузера. Шукав щось, що не перезавантажується.
developarvin

Це повинно мати можливість обійтися без оновлень сторінок, але, наскільки я знаю, це підтримується лише в новіших браузерах. Натомість слід змінити хеш-адресу.
Клаус,

0

Вам потрібно буде бути більш конкретним. Що ви маєте на увазі під словом «оновити URL-адресу»? Це може означати автоматичний перехід на іншу сторінку, що, безумовно, можливо.

Якщо ви хочете просто оновити вміст адресного рядка без перезавантаження сторінки, див. Змінення URL-адреси без перезавантаження сторінки


Дякую за посилання! Я дивлюсь на відповіді
Develoarvin

-3

Так - document.location.hashдля запитів


1
Це перезавантажує сторінку. Я шукаю рішення, яке не видаляє сторінку.
developarvin

Так, він перезавантажує сторінку. Вам потрібно поєднати це з ajax, щоб отримати нову сторінку та вставити її вміст.
Роман

Той, хто задає питання, не хоче перезавантажувати сторінку.
Chewie The Chorkie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.