Есть ли способ получить URL без строки запроса?


268

У меня есть URL, как http://localhost/dms/mduserSecurity/UIL/index.php?menu=true&submenu=true&pcode=1235.

Я хочу , чтобы получить URL без строки запроса: http://localhost/dms/mduserSecurity/UIL/index.php.

Есть ли способ для этого в JavaScript? В настоящее время я использую document.location.href, но он возвращает полный URL.


Ответы:


348

Попробуй это: window.location.href.split('?')[0]


12
@ Линкольн - Почему? Я не вижу причин, по которым это было бы небезопасно. Он также находится в пределах спецификаций (как спецификации для того, что должен возвращать window.location.href, так и спецификации о том, как работает URL), поэтому у него не должно быть никаких проблем в будущем. Это легче читать и понимать для более чистого кода. Это короче для меньшего кода. И, наконец, это менее интенсивно и менее сложно, чем ответ Феликса. Я не говорю, что Феликс неправ, но я говорю, что без какого-то конкретного примера отказа / ненадежности этот ответ превосходит во всех отношениях.
Джимбо Джонни

1
Вы должны использовать window.location.pathname ..etc, как и в других ответах
Muayyad Alsadi

22
@JimboJonny @Marcel Это не обрабатывает идентификаторы фрагментов (например, #термин в stackoverflow.com/questions/5817505#5817548 ). Вы должны будете использовать регулярное выражение или несколько функций .split (), и в этот момент вы потеряли значение этого «простого» ответа при очистке URL. Конечно, это технически выходит за рамки вопроса, но я бы сказал, что это все еще актуально.
Andrewb

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

383

Читайте о Window.locationи Locationинтерфейс:

var url = [location.protocol, '//', location.host, location.pathname].join('');

27
Или, если вы используете es6, вы можете использовать строковый литерал ${location.protocol}//${location.host}${location.pathname}
alexreardon

Хотя обратите внимание, что pathnameможет опустить ведущий /(до IE 11?) . Ах, IE, всегда снежинка, не так ли?
Ёрш

36
location.toString().replace(location.search, "")

12
Это очень недооцененный ответ. Это единственный, который точно отвечает на вопрос. Еще более короткий вариант:location.href.replace(location.search, '')
Гвидо Боуман

2
что насчет фрагмента, например, domain.com/?x=1#top
Онур Топал,

2
На этот вопрос есть 10 ответов. Только один из них сохраняет хеш ( который не существует в URL, о котором все равно задается вопрос ). Почему в двух комментариях указывается, что этот ответ не сохраняет несуществующий хеш, но не сохраняет ни один из остальных?
Квентин

14
var url = window.location.origin + window.location.pathname;

5
проголосовали против, потому что источник не поддерживается в IE11 :-(
Джордж

6
Почему вы должны что-то понизить, просто потому что это не работает в конкретном браузере? Во многих местах все еще используют IE10 в качестве стандарта из-за приложений, которые они используют.
Брэд

1
Работает в IE11.309.16299.0
Райан

10

Если вы также хотите удалить хеш, попробуйте следующее: window.location.href.split(/[?#]/)[0]


5

Пытаться:

document.location.protocol + '//' +
document.location.host +
document.location.pathname;

(Примечание: .hostвместо того, .hostnameчтобы порт включался, если необходимо)



4

просто обрежьте строку, используя split (простой способ):

var myString = "http://localhost/dms/mduserSecurity/UIL/index.php?menu=true&submenu=true&pcode=1235"
var mySplitResult = myString.split("?");
alert(mySplitResult[0]);

3

Чтобы получить все части URL, кроме запроса:

var url = (location.origin).concat(location.pathname).concat(location.hash);

Обратите внимание, что это включает и хэш, если он есть (я знаю, что в вашем примере URL нет хэша, но я включил этот аспект для полноты). Чтобы устранить хеш, просто исключите .concat(location.hash).

Лучше использовать concatдля объединения строк Javascript вместе (а не +): в некоторых ситуациях это позволяет избежать проблем, таких как путаница типов.



1

Вот два метода:

<script type="text/javascript">
    var s="http://localhost/dms/mduserSecurity/UIL/index.php?menu=true&submenu
                                =true&pcode=1235";

    var st=s.substring(0, s.indexOf("?"));

    alert(st);

    alert(s.replace(/\?.*/,''));
</script>


0

Просто добавьте эти две строки в $ (document) .ready в JS следующим образом:

$(document).ready(function () {
 $("div.sidebar nav a").removeClass("active");
        $('nav a[href$="'+ window.location.pathname.split("?")[0] +'"]').addClass('active');
});

лучше использовать знак доллара ($) (Конец с)

$('nav a[href$

вместо (^) (начать с)

$('nav a[href^

потому что, если вы используете знак (^) и у вас есть вложенные URL в меню навигации (например, "/ account" и "/ account / role")

Это активирует их обоих.


0

Если вы используете dot net core 3.1, он игнорирует регистр маршрут , поэтому предыдущий способ не поможет, если маршрут написан строчными буквами, а пользователь записывает маршрут заглавными буквами.

Итак, следующий код очень полезен:

$(document).ready(function () {
    $("div.sidebar nav a").removeClass("active");
    var urlPath = window.location.pathname.split("?")[0];
    var nav = $('div.sidebar nav a').filter(function () {
        return $(this).attr('href').toLowerCase().indexOf(urlPath.toLocaleLowerCase()) > -1;
    });
    $(nav).each(function () {
        if ($(this).attr("href").toLowerCase() == urlPath.toLocaleLowerCase())
            $(this).addClass('active');
    });
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.