Удаление параметров URL без обновления страницы


Я пытаюсь удалить все после "?"в браузере 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]);
});
11 69

11 ответов:

TL; DR

чтобы изменить текущий URL и добавить его (новый измененный URL) в качестве нового URL-адреса для записей истории используйте pushState:

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

чтобы заменить текущий URL без добавления его в записи истории, используйте replaceState:

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

в зависимости от вашей бизнес-логики 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- метод replaceState () если вы хотите чтобы обновить/заменить настоящее запись истории.

history.replaceState() работает точно так же, как history.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

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

альтернативный подход было бы на самом деле перенаправить вашу страницу (но вы потеряете строке запроса `?', это все еще необходимо или данные были обработаны?).

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

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

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

простой способ сделать это, работает на любой странице, требует 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 the the history, this changes the url without reloading the page

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

Я считаю, что лучший и самый простой метод для этого:

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

если у меня есть специальный тег в конце моего 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.history.pushState(null, null, window.location.pathname);

чтобы очистить все параметры, не делая обновления страницы, и если вы используете HTML5, то вы можете сделать это:

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

добавить запись в историю браузера. Вы также можете рассмотреть replaceState Если вы не хотите добавлять новую запись и просто хотите заменить старую запись.

Я хотел удалить только одну парам success. Вот как вы можете это сделать:

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

это также сохраняет #hash.


URLSearchParams не будет работать на IE, но работает на краю. Вы можете использовать полифилл или может использовать наивную вспомогательную функцию для IE-support:

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)
//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;     
}

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

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

в jquery используйте

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