Видаліть параметри URL-адреси без оновлення сторінки


153

Я намагаюся видалити все після "?" в URL-адресі браузера на документ готовий.

Ось що я намагаюся:

jQuery(document).ready(function($) {

var url = window.location.href;
    url = url.split('?')[0];
});

Я можу це зробити і побачити, як це працює нижче:

jQuery(document).ready(function($) {

var url = window.location.href;
    alert(url.split('?')[0]);
});

Майте дві форми на одній сторінці, і коли одна форма подається, вона додає продукт у кошик і додає довгий параметр до URL після оновлення сторінки. Отже, я хочу мати змогу видалити цей параметр, коли документ готовий і він починається з?
Дерек

1
Якщо ви хочете оновити сторінку, навіщо чекати .ready()? Вам не потрібно чекати, щоб перенаправити на нову URL-адресу або просто використовувати так, .pushState()як рекомендував Joraid.
jfriend00

Відповіді:


227

TL; DR

1- Щоб змінити поточну URL-адресу та додати / ввести її (нову модифіковану URL-адресу) як новий запис URL-адреси до списку історії, використовуйте pushState:

window.history.pushState({}, document.title, "/" + "my-new-url.html");

2- Щоб замінити поточну URL-адресу, не додаючи її до записів історії, використовуйте replaceState:

window.history.replaceState({}, document.title, "/" + "my-new-url.html");

3- Залежно від вашої логіки бізнесу , pushStateбуде корисно у таких випадках:

  • ви хочете підтримати кнопку повернення браузера

  • Ви хочете створити на новий URL, додати / вставити / натиснути новий URL в історії записів, і зробити його поточним URL

  • дозволяючи користувачам робити закладки на сторінці з однаковими параметрами (показувати однаковий вміст)

  • для програмного доступу до даних через stateObjтодішній синтаксичний аналіз з якоря


Як я зрозумів з вашого коментаря, ви хочете очистити свою URL-адресу, не перенаправляючи знову.

Зауважте, що ви не можете змінити всю URL-адресу. Ви можете просто змінити те, що відбувається після імені домену. Це означає, що ви не можете змінити, www.example.com/але ви можете змінити те, що настає після.com/

www.example.com/old-page-name => can become =>  www.example.com/myNewPaage20180322.php

Фон

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

1- Метод pushState (), якщо ви хочете додати нову модифіковану URL-адресу до записів історії.

2- Метод substituState (), якщо ви хочете оновити / замінити поточний запис історії.

.replaceState()працює точно так, .pushState()за винятком того, що .replaceState() змінює поточний запис історії замість створення нового. Зауважте, що це не заважає створити новий запис у світовій історії браузера.


.replaceState()особливо корисно, коли ви хочете оновити об'єкт стану або URL поточного запису історії у відповідь на певні дії користувача.


Код

Для цього я використаю метод pushState () для цього прикладу, який працює аналогічно наступному формату:

var myNewURL = "my-new-URL.php";//the new URL
window.history.pushState("object or string", "Title", "/" + myNewURL );

Ви можете замінити pushStateз replaceStateурахуванням Ваших побажань.

Ви можете замінити параметр "object or string"на {}і "Title"з document.titleтаким чином, остаточний склад стане:

window.history.pushState({}, document.title, "/" + myNewURL );

Результати

У попередніх двох рядках коду буде внесена така URL-адреса, як:

https://domain.tld/some/randome/url/which/will/be/deleted/

Ставати:

https://domain.tld/my-new-url.php

Дія

Тепер спробуємо інший підхід. Скажіть, що вам потрібно зберегти ім’я файлу. Назва файлу надходить після останнього /та перед рядком запиту ?.

http://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john

Буде:

http://www.someDomain.com/keepThisLastOne.php

Щось подібне призведе до роботи:

 //fetch new URL
 //refineURL() gives you the freedom to alter the URL string based on your needs. 
var myNewURL = refineURL();

//here you pass the new URL extension you want to appear after the domains '/'. Note that the previous identifiers or "query string" will be replaced. 
window.history.pushState("object or string", "Title", "/" + myNewURL );


//Helper function to extract the URL between the last '/' and before '?' 
//If URL is www.example.com/one/two/file.php?user=55 this function will return 'file.php' 
 //pseudo code: edit to match your URL settings  

   function refineURL()
{
    //get full URL
    var currURL= window.location.href; //get current address

    //Get the URL between what's after '/' and befor '?' 
    //1- get URL after'/'
    var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
    //2- get the part before '?'
    var beforeQueryString= afterDomain.split("?")[0];  

    return beforeQueryString;     
}

ОНОВЛЕННЯ:

Для одного шанувальника вкладиша спробуйте це на консолі / firebug, і URL-адреса цієї сторінки зміниться:

    window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);

URL-адреса цієї сторінки зміниться від:

http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103

До

http://stackoverflow.com/22753103#22753103

Примітка: як вказав Самуель Liew у коментарях нижче, ця функція була введена лише для HTML5.

Альтернативним підходом було б фактичне перенаправлення вашої сторінки (але ви втратите рядок запиту `? ', Вона все ще потрібна або дані оброблені?).

window.location.href =  window.location.href.split("?")[0]; //"http://www.newurl.com";


2
Ви забули згадати, що це лише HTML5-функція. developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/…
Samuel Liew

Чому ви знімаєте з останньої косою рисою? Що це стосується питання ОП? Вони просто хочуть позбутися рядка запиту. Перший знак питання визначає початок рядка запиту.
jfriend00

6
replaceStateздається, що краще підходить, але також pushStateбуде працювати, тобто поки ви не почнете натискати кнопки назад і вперед у браузері і не зрозумієте, що є цілі бібліотеки для роботи з API API.
adeneo

@ jfriend00 на основі поведінки функції, те, що ви додасте в третьому параметрі, буде розміщено в URL-адресі після доменного імені, тобто після домену / як у www.example.com/. Є ймовірність, що в ОП може бути кілька / між доменним іменем і? у випадку, якщо веб-сайт знаходиться в підкаталозі, отже, йому належить розібратися та зробити краще вдосконалення URL-адреси, оскільки питання полягало у тому, як змінити URL-адресу, а тепер як правильно його встановити.
Мохаммед Жораїд

Я просто кажу, що вам це зовсім не потрібно url.substring(url.lastIndexOf('/') + 1);. url.split("?")[0]отримаю частину перед першим знаком запитання, який є всім, на який я думаю, що ОП попросив. Питання ОП запитує: "Я намагаюся видалити все після"? "В URL-адресі браузера".
jfriend00

157

Це все вводить в оману, ви ніколи не хочете додавати в історію веб-переглядача, якщо ви не хочете перейти на іншу сторінку в одному додатку сторінки. Якщо ви хочете видалити параметри без зміни сторінки, ви повинні використовувати:

window.history.replaceState(null, null, window.location.pathname);

3
KISS (Тримати дурно і просто). ОП попросили зняти всіх після? і це найпростіша відповідь, яку ви можете отримати за те, що він попросив!
Warface

Не працює на Firefox. Під час оновлення параметри отримання ще відображаються. Працює, використовуючи як push, так і заміну window.history.replaceState ({сторінка: location.pathname}, document.title, window.location.pathname); window.history.pushState ({сторінка: location.pathname}, document.title, window.location.pathname);
Аджай Сінгх

1
history.replaceState (null, null, location.pathname + location.hash) - додайте location.hash, якщо ви не хочете видалити цю частину
eselk

29

простий спосіб зробити це, працює на будь-якій сторінці, вимагає HTML 5

// get the string following the ?
var query = window.location.search.substring(1)

// is there anything there ?
if(query.length) {
   // are the new history methods available ?
   if(window.history != undefined && window.history.pushState != undefined) {
        // if pushstate exists, add a new state to the history, this changes the url without reloading the page

        window.history.pushState({}, document.title, window.location.pathname);
   }
}

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

1
перші два рядки перевіряють, чи є щось після? (підрядка просто видаляє '?'), то я перевіряю, чи підтримує браузер новий виклик pushstate, і, нарешті, я використовую pushstate, щоб додати стан до стеку URL-адрес (ви можете натискати та виводити URL-адреси на цей стек), window.location .pathname - це локальна URL-адреса мінус запит і мінус доменне ім’я та префікс ( domain.com/THIS?notthis )
Martijn Scheffer


23

Я вважаю, що найкращий і найпростіший метод для цього:

var newURL = location.href.split("?")[0];
window.history.pushState('object', document.title, newURL);

11

якщо у мене в кінці URL-адреси є спеціальний тег, наприклад: http://domain.com/?tag=12345 Ось наведений нижче код для видалення цього тегу, коли він відображається в URL-адресі:

<script>
// Remove URL Tag Parameter from Address Bar
if (window.parent.location.href.match(/tag=/)){
    if (typeof (history.pushState) != "undefined") {
        var obj = { Title: document.title, Url: window.parent.location.pathname };
        history.pushState(obj, obj.Title, obj.Url);
    } else {
        window.parent.location = window.parent.location.pathname;
    }
}
</script>

Це дає ідею видалити один або декілька (або всіх) параметрів з URL

З window.location.pathname ви в основному отримуєте все раніше, ніж "?" в URL-адресі.

var pathname = window.location.pathname; // Повертає лише шлях

var url = window.location.href; // Повертає повну URL-адресу


я не впевнений, що це відповідає на питання, але саме питання незрозуміле :)
Martijn Scheffer

@MartijnScheffer правильно, я покращив відповідь на адресу, відповідаючи на оригінальне запитання, дякую за примітку.
Тарік

10

Я хотів зняти лише один парам success. Ось як це можна зробити:

let params = new URLSearchParams(location.search)
params.delete('success')
history.replaceState(null, '', '?' + params + location.hash)

Це також зберігає #hash.


URLSearchParamsне працюватиме на IE, але над ним працюватиме Edge . Для підтримки IE ви можете використовувати полі-заповнювач або функцію наївного помічника:

function take_param(key) {
    var params = new Map(location.search.slice(1).split('&')
        .map(function(p) { return p.split(/=(.*)/) }))   
    var value = params.get(key)
    params.delete(key)
    var search = Array.from(params.entries()).map(
        function(v){ return v[0]+'='+v[1] }).join('&')
    return {search: search ? '?' + search : '', value: value}
}

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

history.replaceState(
    null, '', take_param('success').search + location.hash)

Чудове рішення, чи є спосіб не додати "?" якщо не передано парами?
рик

2
@RickS Звичайно, take_paramвже робить це, але ви можете зробити URLSearchParamsте ж саме, виконавши: history.replaceState(null, '', (params ? '?' + params : '') + location.hash). Або, як вам подобається.
odinho - Велмонт


6

Жодне з цих рішень не працювало для мене. Ось функція, сумісна з IE11, яка також може видалити декілька параметрів:

/**
* Removes URL parameters
* @param removeParams - param array
*/
function removeURLParameters(removeParams) {
  const deleteRegex = new RegExp(removeParams.join('=|') + '=')

  const params = location.search.slice(1).split('&')
  let search = []
  for (let i = 0; i < params.length; i++) if (deleteRegex.test(params[i]) === false) search.push(params[i])

  window.history.replaceState({}, document.title, location.pathname + (search.length ? '?' + search.join('&') : '') + location.hash)
}

removeURLParameters(['param1', 'param2'])

2
//Joraid code is working but i altered as below. it will work if your URL contain "?" mark or not
//replace URL in browser
if(window.location.href.indexOf("?") > -1) {
    var newUrl = refineUrl();
    window.history.pushState("object or string", "Title", "/"+newUrl );
}

function refineUrl()
{
    //get full url
    var url = window.location.href;
    //get url after/  
    var value = url = url.slice( 0, url.indexOf('?') );
    //get the part after before ?
    value  = value.replace('@System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"]','');  
    return value;     
}

1

Щоб очистити всі параметри, не оновлюючи сторінку, І якщо ви використовуєте HTML5, ви можете зробити це:

history.pushState({}, '', 'index.html' ); //replace 'index.html' with whatever your page name is

Це додасть запис в історію браузера. Ви також можете розглянути, replaceStateякщо ви не хочете додати новий запис і просто хочете замінити старий запис.


0

У jquery використовуйте <

window.location.href =  window.location.href.split("?")[0]

6
Про це немає нічого у jQuery
j08691

0

Ось один вкладиш ES6, який зберігає хеш розташування і не забруднює історію браузера, використовуючи replaceState:

(l=>{window.history.replaceState({},'',l.pathname+l.hash)})(location)

Чи можете ви додати трохи інформації про це, важко зрозуміти, що це робить.
рик

2
@RickS Це IIFE (негайно викликається вираз функції), тому він загорнутий у дужки () (розташування), перша дужка дає змогу залишатися самостійно як анонімна функція, (розташування) в кінці негайно викликає функцію передачі її об’єкт global locationaka window.location, тому функція має доступ до глобалів, locationоскільки lрешта є базовою замінаState, як і у всіх інших відповідях, він об'єднує ім'я шляху та хеш (example.com/#hash) як новий URL. Сподіваюся, що це засвоюється, якщо не повідомте мені know
Може Рау

@Може чому не просто використовувати window.history.replaceState({}, '', location.pathname + location.hash)? ;)
Фабіан фон Еллертс

@FabianvonEllerts Насправді гарне запитання, не дуже впевнений, єдине, що вам не потрібно писати location2 рази 😁, але не потрібно призначати його змінній 😉 чи є ще їй Джої?
Може Рау
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.