Как я могу удалить параметр строки запроса в JavaScript? - PullRequest
108 голосов
/ 28 октября 2009

Есть ли лучший способ удалить параметр из строки запроса в строке URL в стандартном JavaScript, кроме использования регулярного выражения?

Вот то, что я до сих пор придумал, что, похоже, работает в моих тестах, но я не люблю заново изобретать синтаксический анализ строки запроса!

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

Ответы [ 19 ]

3 голосов
/ 14 февраля 2017

Использование 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;
}
2 голосов
/ 24 апреля 2013

Все ответы в этой теме имеют недостаток в том, что они не сохраняют части ссылок / фрагменты URL.

Так что, если ваш URL выглядит так:

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

и вы заменяете 'параметр'

вы потеряете свой фрагмент текста.

Ниже приводится адаптация предыдущих ответов (bobince через LukePH), которая решает эту проблему:

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;
}
2 голосов
/ 20 января 2017

Из того, что я вижу, ничего из вышеперечисленного не может обрабатывать нормальные параметры и параметры массива. Вот тот, который делает.

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

Как это использовать:

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

Конечно, чтобы обновить параметр, просто удалите и добавьте. Не стесняйтесь сделать для него фиктивную функцию.

2 голосов
/ 26 января 2015

Вы должны использовать библиотеку для манипулирования URI, поскольку это сложнее, чем кажется на первый взгляд, сделать это самостоятельно. Взгляните на: http://medialize.github.io/URI.js/

0 голосов
/ 18 декабря 2018

Это чистая версия удалить параметр запроса с классом URL для современных браузеров:

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

URLSearchParams не поддерживается старыми браузерами

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

IE, Edge (ниже 17) и Safari (ниже 10.3) не поддерживают URLSearchParams внутри класса URL.

Polyfills

URLSearchParams только polyfill

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

Заполните Polyfill URL и URLSearchParams, чтобы соответствовать последним спецификациям WHATWG

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

0 голосов
/ 19 апреля 2016

Возвращает URL без каких-либо параметров 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 );
}
0 голосов
/ 11 декабря 2015

Модифицированная версия решения от ssh_imov

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

Звоните вот так

removeParam("http://google.com?q=123&q1=234&q2=567", "q1=234");
// returns http://google.com?q=123&q2=567
0 голосов
/ 28 октября 2009

Если вы в jQuery, есть хороший плагин для манипуляции со строками запроса:

0 голосов
/ 06 марта 2015
function removeQueryStringParameter(uri, key, value) 
{

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

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

    if (uri.match(re)) {

        return uri.replace(re, '');

    }
}
...