Jak mogę usunąć parametr ciągu zapytania w JavaScript?

127

Czy istnieje lepszy sposób na usunięcie parametru z ciągu zapytania w ciągu adresu URL w standardowym języku JavaScript inny niż użycie wyrażenia regularnego?

Oto, co do tej pory wymyśliłem, co wydaje się działać w moich testach, ale nie lubię wymyślać na nowo analizowania zapytań!

function RemoveParameterFromUrl( url, parameter ) {

    if( typeof parameter == "undefined" || parameter == null || parameter == "" ) throw new Error( "parameter is required" );

    url = url.replace( new RegExp( "\\b" + parameter + "=[^&;]+[&;]?", "gi" ), "" ); "$1" );

    // remove any leftover crud
    url = url.replace( /[&;]$/, "" );

    return url;
}
Matthew Lock
źródło

Odpowiedzi:

178
"[&;]?" + parameter + "=[^&;]+"

Wydaje się niebezpieczne, ponieważ parametr „bar” pasuje do:

?a=b&foobar=c

Ponadto zakończy się niepowodzeniem, jeśli parameterzawiera jakiekolwiek znaki specjalne w wyrażeniu regularnym, takie jak „.”. Nie jest to globalne wyrażenie regularne, więc usunie tylko jedno wystąpienie parametru.

Nie użyłbym do tego prostego RegExp, przeanalizowałbym parametry i stracił te, których nie chcesz.

function removeURLParameter(url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts = url.split('?');   
    if (urlparts.length >= 2) {

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = urlparts[1].split(/[&;]/g);

        //reverse iteration as may be destructive
        for (var i = pars.length; i-- > 0;) {    
            //idiom for string.startsWith
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {  
                pars.splice(i, 1);
            }
        }

        return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');
    }
    return url;
}
bobince
źródło
Dobra uwaga na temat paska pasującego do foobara. Zaktualizowałem pierwotne wyrażenie regularne, aby wymagało znaku? lub [&;] na początku. Czytam również twoje rozwiązanie, aby je rozważyć ...
Matthew Lock
5
Jeśli chcesz pozbyć się znaku „?” jeśli po usunięciu nie ma żadnych parametrów, dodaj warunek if, aby sprawdzić, czy pars.length == 0, a jeśli jest równy 0, wprowadź „url = urlparts [0]” zamiast dołączania znaku „?”.
johnmcaliley
2
Czy można bezpiecznie porównać fragment adresu URL z encodeURIComponent (parametr)? A jeśli adres URL inaczej koduje nazwę parametru? Na przykład „dwa% 20 słów” kontra „dwa + słowa”. Aby sobie z tym poradzić, lepiej zdekodować nazwę parametru i porównać ją z normalnym łańcuchem.
Adrian Pronk
9
Nieznaczna poprawa, tak że po usunięciu parametru końcowego adresu URL znak „?” również zostanie usunięty: Zmień linię url= urlparts[0]+'?'+pars.join('&');naurl= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
Cody S
2
@ ktutnik / @ JonasAxelsson W parametrach zapytania URL nie jest rozróżniana wielkość liter.
bobince
30

Nowoczesne przeglądarki zapewniają URLSearchParamsinterfejs do pracy z parametrami wyszukiwania. Który ma deletemetodę, która usuwa parametr według nazwy.

if (typeof URLSearchParams !== 'undefined') {
  const params = new URLSearchParams('param1=1&param2=2&param3=3')
  
  console.log(params.toString())
  
  params.delete('param2')
  
  console.log(params.toString())

} else {
  console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`)
}

Yury Tarabanko
źródło
2
Pamiętaj, że URLSearchParamsnie jest obsługiwane przez przeglądarkę IE, Edge 16 i iOS 10.2 Safari. (ref: caniuse.com/#feat=urlsearchparams )
khiav reoy
3
@khiavreoy Yeah. Podobnie jak pierwsze dwa słowa w odpowiedzi podają ten sam link :)
Yury Tarabanko
23

Skopiowano z odpowiedzi bobince, ale sprawiłeś, że obsługuje znaki zapytania w ciągu zapytania, np

http://www.google.com/search?q=test???+something&aq=f

Czy poprawne jest posiadanie więcej niż jednego znaku zapytania w adresie URL?

function removeUrlParameter(url, parameter) {
  var urlParts = url.split('?');

  if (urlParts.length >= 2) {
    // Get first part, and remove from array
    var urlBase = urlParts.shift();

    // Join it back up
    var queryString = urlParts.join('?');

    var prefix = encodeURIComponent(parameter) + '=';
    var parts = queryString.split(/[&;]/g);

    // Reverse iteration as may be destructive
    for (var i = parts.length; i-- > 0; ) {
      // Idiom for string.startsWith
      if (parts[i].lastIndexOf(prefix, 0) !== -1) {
        parts.splice(i, 1);
      }
    }

    url = urlBase + '?' + parts.join('&');
  }

  return url;
}
LukePH
źródło
2
Uważam, że ???składnia jest nieprawidłowa i nigdy nie powinna występować w adresie URL`.
@torazaburo Spójrz na postawione przeze mnie pytanie związane z stackoverflow: „Czy można mieć więcej niż jeden znak zapytania w adresie URL?”, odpowiedź brzmi tak. Również to było lata temu, więc nie pamiętam szczegółów, ale napotkałem problemy, gdy nie zostało to poprawnie rozwiązane.
LukePH
Nie mówię, że nie istnieją w prawdziwym świecie i prawdopodobnie chciałoby się je obsłużyć, ale w odpowiednio utworzonym adresie URL znak zapytania to „zastrzeżony znak” i każdy inny znak zapytania niż ten wprowadzenie parametrów zapytania powinno być zakodowane w postaci adresu URL.
1
Możesz zamienić ostatnią linię na, return url.endsWith("?") ? url.slice(0,-1) : url;aby uwzględnić przypadek, w którym parametr do usunięcia jest jedynym parametrem w ciągu zapytania
Konamiman
@Konamiman To zmieniłoby dane parametrów, na przykład podczas usuwania „aq” z: google.com/search?q=test???&aq=f, ale rozumiem, co masz na myśli, byłoby miło wyczyścić adres URL, nawet jeśli ? nie szkodzi. Logika musi tylko upewnić się, że ostatnia? jest również pierwszym?
LukePH
21

Nie widzę poważnych problemów z rozwiązaniem regex. Ale nie zapomnij o zachowaniu identyfikatora fragmentu (tekst po #).

Oto moje rozwiązanie:

function RemoveParameterFromUrl(url, parameter) {
  return url
    .replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1')
    .replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
}

I do rzeczy bobince'a, tak - .w nazwach parametrów musiałbyś uciekać przed znakami.

Jared
źródło
1
Oto ulepszone wyrażenie regularne, które działa, gdy parametr nie ma wartości (np. „Ex.com?removeMe”) i nie zastępuje parametru we fragmentach (np. „Ex.com?#&dont=removeMe”) ani ścieżkach (tj. „ ex.com/&dont=removeMe '):url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)' ), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4')
Stephen M. Harris
To nie zadziała, Stephen M. Harris. Spróbuj podać swojemu kodowi pusty ciąg jako parametr i zobacz, co się stanie ...
David Fischer
15

Możesz zmienić adres URL za pomocą:

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

w ten sposób możesz nadpisać adres URL bez parametru wyszukiwania, używam go do czyszczenia adresu URL po pobraniu parametrów GET.

Santi Nunez
źródło
13

Każdy zainteresowany rozwiązaniem regex utworzyłem tę funkcję, aby dodać / usunąć / zaktualizować parametr querystring. Niepodanie wartości spowoduje usunięcie parametru, podanie jednej spowoduje dodanie / zaktualizowanie parametru. Jeśli adres URL nie zostanie podany, zostanie pobrany z window.location. To rozwiązanie uwzględnia również zakotwiczenie adresu URL.

function UpdateQueryString(key, value, url) {
    if (!url) url = window.location.href;
    var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
        hash;

    if (re.test(url)) {
        if (typeof value !== 'undefined' && value !== null)
            return url.replace(re, '$1' + key + "=" + value + '$2$3');
        else {
            hash = url.split('#');
            url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
            if (typeof hash[1] !== 'undefined' && hash[1] !== null) 
                url += '#' + hash[1];
            return url;
        }
    }
    else {
        if (typeof value !== 'undefined' && value !== null) {
            var separator = url.indexOf('?') !== -1 ? '&' : '?';
            hash = url.split('#');
            url = hash[0] + separator + key + '=' + value;
            if (typeof hash[1] !== 'undefined' && hash[1] !== null) 
                url += '#' + hash[1];
            return url;
        }
        else
            return url;
    }
}

AKTUALIZACJA

Wystąpił błąd podczas usuwania pierwszego parametru z kwerendy, przerobiłem wyrażenie regularne i przetestowałem, aby uwzględnić poprawkę.

AKTUALIZACJA 2

Aktualizacja @schellmax w celu naprawienia sytuacji, w której symbol hashtagu jest tracony podczas usuwania zmiennej zapytania bezpośrednio przed hashtagiem

ellemayo
źródło
1
To nie działa, jeśli masz dwa ciągi zapytań i usuniesz pierwszy. Przekazany adres URL staje się nieprawidłowy, ponieważ? jest usuwany, gdy powinien zostać zakonserwowany.
Blake Niemyjski
1
@BlakeNiemyjski dziękuję za znalezienie tego błędu, zaktualizowałem skrypt, aby uwzględnić obejście pierwszego parametru
ellemayo
1
przypadkowo usunie hash tutaj:UpdateQueryString('a', null, 'http://www.test.com?a=b#c');
schellmax
Fajna funkcja, dzięki. Do Twojej wiadomości: podczas używania tego z ignorowaniem kluczy tablicy w każdej pętli () `, może być konieczne zdefiniowanie zmniejszania się urldla każdej iteracji zastępowania. Ale to oznacza, że ​​musisz wpisać a valuew argumentach, co spowoduje, że querystring zostanie w połowie usunięty. Aby temu przeciwdziałać, użycie undefinedlub nulldo valueargumentu typu:url_from_last_iteration = UpdateQueryString(current_ignore_key, undefined/null, url_from_last_iteration);
dhaupin
7

Zakładając, że chcesz usunąć parametr key = val z identyfikatora URI:

function removeParam(uri) {
   return uri.replace(/([&\?]key=val*$|key=val&|[?&]key=val(?=#))/, '');
}
ssh_imov
źródło
Działa dobrze, ale unikanie pierwszego znaku zapytania w wyrażeniu regularnym jest niepotrzebne i może powodować błąd lintera: /([&?]key=val*$|key=val&|[?&]key=val(?=#))/może być preferowane, gdy używasz liniowca, takiego jak eslint
quetzaluz
7

Oto czego używam:

if (location.href.includes('?')) { 
    history.pushState({}, null, location.href.split('?')[0]); 
}

Oryginalny adres URL: http://www.example.com/test/hello?id=123&foo=bar
Docelowy adres URL: http://www.example.com/test/hello

Basj
źródło
Czy piszesz ten kod podczas ładowania strony? Pytam cię, ponieważ kiedy piszę to ładowanie strony lub nie, to nie działa.
noobprogrammer
6

Oto kompletna funkcja dodawania i usuwania parametrów na podstawie tego pytania i tego githuba: https://gist.github.com/excalq/2961415

var updateQueryStringParam = function (key, value) {

    var baseUrl = [location.protocol, '//', location.host, location.pathname].join(''),
        urlQueryString = document.location.search,
        newParam = key + '=' + value,
        params = '?' + newParam;

    // If the "search" string exists, then build params from it
    if (urlQueryString) {

        updateRegex = new RegExp('([\?&])' + key + '[^&]*');
        removeRegex = new RegExp('([\?&])' + key + '=[^&;]+[&;]?');

        if( typeof value == 'undefined' || value == null || value == '' ) { // Remove param if value is empty

            params = urlQueryString.replace(removeRegex, "$1");
            params = params.replace( /[&;]$/, "" );

        } else if (urlQueryString.match(updateRegex) !== null) { // If param exists already, update it

            params = urlQueryString.replace(updateRegex, "$1" + newParam);

        } else { // Otherwise, add it to end of query string

            params = urlQueryString + '&' + newParam;

        }

    }
    window.history.replaceState({}, "", baseUrl + params);
};

Możesz dodać takie parametry:

updateQueryStringParam( 'myparam', 'true' );

I usuń to w ten sposób:

updateQueryStringParam( 'myparam', null );

W tym wątku wielu powiedziało, że regex prawdopodobnie nie jest najlepszym / stabilnym rozwiązaniem ... więc nie jestem w 100% pewien, czy to coś ma jakieś wady, ale o ile to przetestowałem, działa całkiem dobrze.

GDY
źródło
5

To jest poprawna wersja parametru zapytania usuwająca zapytanie z klasą URL dla dzisiejszych przeglądarek:

function removeUrlParameter(url, paramKey)
{
  var r = new URL(url);
  r.searchParams.delete(paramKey);
  return r.href;
}

URLSearchParams nie są obsługiwane w starszych przeglądarkach

https://caniuse.com/#feat=urlsearchparams

IE, Edge (poniżej 17) i Safari (poniżej 10.3) nie obsługują URLSearchParams w klasie URL.

Polyfills

Tylko wypełnienie URLSearchParams

https://github.com/WebReflection/url-search-params

Uzupełnij adres URL Polyfill i URLSearchParams, aby dopasować je do ostatnich specyfikacji WHATWG

https://github.com/lifaon74/url-polyfill

Heroselohim
źródło
4

Korzystanie z jQuery:

function removeParam(key) {
    var url = document.location.href;
    var params = url.split('?');
    if (params.length == 1) return;

    url = params[0] + '?';
    params = params[1];
    params = params.split('&');

    $.each(params, function (index, value) {
        var v = value.split('=');
        if (v[0] != key) url += value + '&';
    });

    url = url.replace(/&$/, '');
    url = url.replace(/\?$/, '');

    document.location.href = url;
}
Huy Phạm
źródło
3

Powyższa wersja jako funkcja

function removeURLParam(url, param)
{
 var urlparts= url.split('?');
 if (urlparts.length>=2)
 {
  var prefix= encodeURIComponent(param)+'=';
  var pars= urlparts[1].split(/[&;]/g);
  for (var i=pars.length; i-- > 0;)
   if (pars[i].indexOf(prefix, 0)==0)
    pars.splice(i, 1);
  if (pars.length > 0)
   return urlparts[0]+'?'+pars.join('&');
  else
   return urlparts[0];
 }
 else
  return url;
}
Graham
źródło
2

Do manipulacji URI powinieneś używać biblioteki, ponieważ jest to bardziej skomplikowane, niż się wydaje na pierwszy rzut oka, aby zrobić to sam. Spójrz na: http://medialize.github.io/URI.js/

Ryan
źródło
2

Z tego, co widzę, żadne z powyższych nie obsługuje normalnych parametrów i parametrów tablicy. Oto jeden, który to robi.

function removeURLParameter(param, url) {
    url = decodeURI(url).split("?");
    path = url.length == 1 ? "" : url[1];
    path = path.replace(new RegExp("&?"+param+"\\[\\d*\\]=[\\w]+", "g"), "");
    path = path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");
    path = path.replace(/^&/, "");
    return url[0] + (path.length
        ? "?" + path
        : "");
}

function addURLParameter(param, val, url) {
    if(typeof val === "object") {
        // recursively add in array structure
        if(val.length) {
            return addURLParameter(
                param + "[]",
                val.splice(-1, 1)[0],
                addURLParameter(param, val, url)
            )
        } else {
            return url;
        }
    } else {
        url = decodeURI(url).split("?");
        path = url.length == 1 ? "" : url[1];
        path += path.length
            ? "&"
            : "";
        path += decodeURI(param + "=" + val);
        return url[0] + "?" + path;
    }
}

Jak tego użyć:

url = location.href;
    -> http://example.com/?tags[]=single&tags[]=promo&sold=1

url = removeURLParameter("sold", url)
    -> http://example.com/?tags[]=single&tags[]=promo

url = removeURLParameter("tags", url)
    -> http://example.com/

url = addURLParameter("tags", ["single", "promo"], url)
    -> http://example.com/?tags[]=single&tags[]=promo

url = addURLParameter("sold", 1, url)
    -> http://example.com/?tags[]=single&tags[]=promo&sold=1

Oczywiście, aby zaktualizować parametr, po prostu usuń, a następnie dodaj. Możesz zrobić dla niego funkcję zastępczą.

Keir Simmons
źródło
path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");Zmieniłbym wyrażenie regularne tak, [\\w]*aby zawierało parametry takie jak „param =” bez wartości.
Tomas Prado
2

Wszystkie odpowiedzi w tym wątku mają tę wadę, że nie zachowują zakotwiczonych / fragmentów adresów URL.

Jeśli więc Twój adres URL wygląda tak:

http://dns-entry/path?parameter=value#fragment-text

i zastępujesz „parametr”

stracisz swój fragment tekstu.

Poniżej przedstawiono adaptację poprzednich odpowiedzi (bobince przez LukePH), które rozwiązują ten problem:

function removeParameter(url, parameter)
{
  var fragment = url.split('#');
  var urlparts= fragment[0].split('?');

  if (urlparts.length>=2)
  {
    var urlBase=urlparts.shift(); //get first part, and remove from array
    var queryString=urlparts.join("?"); //join it back up

    var prefix = encodeURIComponent(parameter)+'=';
    var pars = queryString.split(/[&;]/g);
    for (var i= pars.length; i-->0;) {               //reverse iteration as may be destructive
      if (pars[i].lastIndexOf(prefix, 0)!==-1) {   //idiom for string.startsWith
        pars.splice(i, 1);
      }
    }
    url = urlBase + (pars.length > 0 ? '?' + pars.join('&') : '');
    if (fragment[1]) {
      url += "#" + fragment[1];
    }
  }
  return url;
}
Bret Weinraub
źródło
1
Nieznaczna poprawa, tak że po usunięciu parametru końcowego adresu URL znak „?” również zostanie usunięty: Zmień linię url = urlBase+'?'+pars.join('&');naurl = urlBase + (pars.length > 0 ? '?' + pars.join('&') : "");
Cody S
co jeśli # pojawi się na pierwszym miejscu? dns-entry / path # fragment-text? parametr = wartość
ajayv
2

Oto rozwiązanie, które:

  1. używa URLSearchParams (bez trudnego do zrozumienia wyrażenia regularnego)
  2. aktualizuje adres URL w pasku wyszukiwania bez ponownego ładowania
  3. utrzymuje wszystkie inne części adresu URL (np. hash)
  4. usuwa zbędne? w ciągu zapytania, jeśli ostatni parametr został usunięty
function removeParam(paramName) {
    let searchParams = new URLSearchParams(window.location.search);
    searchParams.delete(paramName);
    if (history.replaceState) {
        let searchString = searchParams.toString().length > 0 ? '?' + searchParams.toString() : '';
        let newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname +  searchString + window.location.hash;
        history.replaceState(null, '', newUrl);
    }
}

Uwaga: jak wskazano w innych odpowiedziach, URLSearchParams nie jest obsługiwany w IE , więc użyj polyfill .

wskazówki
źródło
2

Jeśli jest to instancja URL, użyj deletefunkcjisearchParams

let url = new URL(location.href);
url.searchParams.delete('page');
Wariored
źródło
1

Inną bezpośrednią i prostszą odpowiedzią byłoby

let url = new URLSearchParams(location.search)
let key = 'some_key'

return url.has(key)
    ? location.href.replace(new RegExp(`[?&]${key}=${url.get(key)}`), '')
    : location.href
ctf0
źródło
0

Zmodyfikowana wersja rozwiązania autorstwa ssh_imov

function removeParam(uri, keyValue) {
      var re = new RegExp("([&\?]"+ keyValue + "*$|" + keyValue + "&|[?&]" + keyValue + "(?=#))", "i"); 
      return uri.replace(re, '');
    }

Zadzwoń tak

removeParam("http://google.com?q=123&q1=234&q2=567", "q1=234");
// returns http://google.com?q=123&q2=567
kiranvj
źródło
jedna rzecz, o której należy pamiętać, wysyłając wartość parametru convert space do% 20
xeon zolt
0

Zwraca adres URL bez DOWOLNYCH parametrów GET:

var href = document.location.href;
var search = document.location.search;
var pos = href.indexOf( search );
if ( pos !== -1 ){
    href = href.slice( 0, pos );
    console.log( href );
}
David Freimaucher
źródło
0

Praktycznie napisałem następującą funkcję, aby przetworzyć parametry adresu URL i uzyskać ostateczny status jako ciąg znaków i przekierować stronę. Mam nadzieję, że to przyniesie korzyści.

function addRemoveUrlQuery(addParam = {}, removeParam = [], startQueryChar = '?'){

    let urlParams = new URLSearchParams(window.location.search);

    //Add param
    for(let i in addParam){
        if(urlParams.has(i)){ urlParams.set(i, addParam[i]); }
        else                { urlParams.append(i, addParam[i]); }
    }

    //Remove param
    for(let i of removeParam){
        if(urlParams.has(i)){
            urlParams.delete(i);
        }
    }

    if(urlParams.toString()){
        return startQueryChar + urlParams.toString();
    }

    return '';
}

Na przykład, kiedy klikam przycisk, chcę, aby wartość strony została usunięta, a wartość kategorii została dodana.

let button = document.getElementById('changeCategory');
button.addEventListener('click', function (e) {

    window.location = addRemoveUrlQuery({'category':'cars'}, ['page']);

});

Myślę, że to było bardzo przydatne!

Emrah Tuncel
źródło
0

Cieszę się, że przewinąłeś tutaj.

Proponuję rozwiązać to zadanie za pomocą następujących możliwych rozwiązań:

  1. Musisz obsługiwać tylko nowoczesne przeglądarki (Edge> = 17) - użyj API URLSearchParams.delete () . Jest natywny i oczywiście jest najwygodniejszym sposobem rozwiązania tego zadania.
  2. Jeśli nie ma takiej opcji, możesz chcieć napisać funkcję, która to zrobi. Taka funkcja ma
    • nie zmieniaj adresu URL, jeśli parametr nie jest obecny
    • usuń parametr adresu URL bez wartości, na przykład http://google.com/?myparm
    • usuń parametr adresu URL z wartością, na przykład http://google.com/?myparm=1
    • usuń parametr adresu URL, jeśli znajduje się w adresie URL dwukrotnie, na przykład http://google.com?qp=1&qpqp=2&qp=1
    • Nie używa forpętli i nie modyfikuje tablicy podczas jej wykonywania w pętli
    • jest bardziej funkcjonalny
    • jest bardziej czytelny niż rozwiązania regexp
    • Przed użyciem upewnij się, że Twój adres URL nie jest zakodowany

Działa w IE> 9 (wersja ES5)

function removeParamFromUrl(url, param) {  // url: string, param: string
  var urlParts = url.split('?'),
      preservedQueryParams = '';

  if (urlParts.length === 2) {
    preservedQueryParams = urlParts[1]
      .split('&')
      .filter(function(queryParam) {
        return !(queryParam === param || queryParam.indexOf(param + '=') === 0)
      })
      .join('&');
  }

  return urlParts[0] +  (preservedQueryParams && '?' + preservedQueryParams); 
}

Fantazyjna wersja ES6

function removeParamFromUrlEs6(url, param) {
  const [path, queryParams] = url.split('?');
	let preservedQueryParams = '';

  if (queryParams) {
    preservedQueryParams = queryParams
      .split('&')
      .filter(queryParam => !(queryParam === param || queryParam.startsWith(`${param}=`)))
      .join('&');
  }

  return `${path}${preservedQueryParams && `?${preservedQueryParams}`}`;  
}

Zobacz, jak to działa tutaj

Szewczenko Wiktor
źródło
0
function removeParamInAddressBar(parameter) {
    var url = document.location.href;
    var urlparts = url.split('?');

    if (urlparts.length >= 2) {
        var urlBase = urlparts.shift();
        var queryString = urlparts.join("?");

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = queryString.split(/[&;]/g);
        for (var i = pars.length; i-- > 0;) {
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {
                pars.splice(i, 1);
            }
        }

        if (pars.length == 0) {
            url = urlBase;
        } else {
            url = urlBase + '?' + pars.join('&');
        }

        window.history.pushState('', document.title, url); // push the new url in address bar
    }
    return url;
}
Alex
źródło
-1
const params = new URLSearchParams(location.search)
params.delete('key_to_delete')
console.log(params.toString())
Neeraj Pathak
źródło
To jest odpowiedź na bardzo stare pytanie, na które już została zaakceptowana odpowiedź. Proszę wyjaśnić, co ma do zaoferowania ta odpowiedź, która jest nowa / różni się od innych odpowiedzi. Ponadto odpowiedzi powinny zawierać wyjaśnienia, a nie tylko kod.
nurdyguy
-2
function removeQueryStringParameter(uri, key, value) 
{

var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");

    var separator = uri.indexOf('?') !== -1 ? "&" : "?";

    if (uri.match(re)) {

        return uri.replace(re, '');

    }
}
Prasad Patil
źródło