Удалить запрос с URL-адреса

Что такое простой способ удалить запрос с пути в Javascript? Я видел плагин для JQuery, который использует window.location.search. Я не могу этого сделать: URL-адрес в моем случае - это переменная, которая устанавливается из AJAX.

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'

Ответ 1

Легкий способ получить это:

function getPathFromUrl(url) {
  return url.split("?")[0];
}

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

function stripQueryStringAndHashFromPath(url) {
  return url.split("?")[0].split("#")[0];
}

ИЗМЕНИТЬ

@caub (изначально @crl) предложил более простое комбо, которое работает как для строки запроса, так и для хэша (хотя использует RegExp, если у кого-то есть проблема с этим):

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}

Ответ 2

2nd Update:. В попытке предоставить исчерпывающий ответ я сравниваю три метода, предложенные в различных ответах.

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
var i;

// Testing the substring method
i = 0;
console.time('10k substring');
while (i < 10000) {
    testURL.substring(0, testURL.indexOf('?'));
    i++;
}
console.timeEnd('10k substring');

// Testing the split method
i = 0;
console.time('10k split');
while (i < 10000) {
    testURL.split('?')[0]; 
    i++;
}
console.timeEnd('10k split');

// Testing the RegEx method
i = 0;
var re = new RegExp("[^?]+");
console.time('10k regex');
while (i < 10000) {
    testURL.match(re)[0]; 
    i++;
}
console.timeEnd('10k regex');

Результаты в Firefox 3.5.8 на Mac OS X 10.6.2:

10k substring:  16ms
10k split:      25ms
10k regex:      44ms

Результаты в Chrome 5.0.307.11 в Mac OS X 10.6.2:

10k substring:  14ms
10k split:      20ms
10k regex:      15ms

Обратите внимание, что метод подстроки хуже по функциональности, поскольку возвращает пустую строку, если URL-адрес не содержит запрос. Другие два метода вернут полный URL-адрес, как и ожидалось. Однако интересно отметить, что метод подстроки является самым быстрым, особенно в Firefox.


1st UPDATE: На самом деле метод split() предложенный Robusto, является лучшим решением, которое я предложил ранее, поскольку он будет работайте, даже если нет запроса:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.split('?')[0];    // Returns: "/Products/List"

var testURL2 = '/Products/List';
testURL2.split('?')[0];    // Returns: "/Products/List"

Исходный ответ:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?'));    // Returns: "/Products/List"

Ответ 3

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

window.location.href = window.location.origin + window.location.pathname;

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

Ответ 4

Простым способом вы можете сделать следующее:

public static String stripQueryStringAndHashFromPath(String uri) {
 return uri.replaceAll(("(\\?.*|\\#.*)"), "");
}

Ответ 5

Если вы находитесь в RegEx....

var newURL = testURL.match(new RegExp("[^?]+"))

Ответ 6

var path = "path/to/myfile.png?foo=bar#hash";

console.log(
    path.replace(/(\?.*)|(#.*)/g, "")
);

Ответ 7

Если вы используете backbone.js(который содержит url anchor как маршрут), может появиться url query string:

  • до url anchor:

    var url = 'http://example.com?a=1&b=3#routepath/subpath';
    
  • после url anchor:

    var url = 'http://example.com#routepath/subpath?a=1&b=3';
    

Решение:

window.location.href.replace(window.location.search, '');
// run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', '');

Ответ 8

Подход с использованием стандартного URL:

/**
 * @param {string} url - An url starting with /
 */
function getPathname(url) {
  return new URL('http://_${url}').pathname
}

getPathname('/foo/bar?cat=5') // /foo/bar

Ответ 9

Если вам нужно выполнить сложную операцию по URL-адресу, вы можете посмотреть в jQuery url parser plugin.

Ответ 10

(() => {
        'use strict';
        const needle = 'SortOrder|Page'; // example
        if ( needle === '' || needle === '{{1}}' ) { 
            return; 
        }           
        const needles = needle.split(/\s*\|\s*/);
        const querystripper = ev => {
                    if (ev) { window.removeEventListener(ev.type, querystripper, true);}
                    try {
                          const url = new URL(location.href);
                          const params = new URLSearchParams(url.search.slice(1));
                          for (const needleremover of needles) {
                                if (params.has(needleremover)) {
                                url.searchParams.delete(needleremover);
                                    window.location.href = url;
                            }
                          }     
                    } catch (ex) { }
        };          
        if (document.readyState === 'loading') {
                 window.addEventListener('DOMContentLoaded', querystripper, true);
        } else {
                 querystripper();
        }
})();

То, как я это сделал, также имеет поддержку RegEx.