Ответ 1
сначала получите текущий адрес
var url = window.location.href
Затем просто проанализируйте эту строку
var arr = url.split("/");
ваш URL:
var result = arr[0] + "//" + arr[2]
Надеюсь, что это поможет
Мне нужно извлечь полный протокол, домен и порт из заданного URL. Например:
https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
сначала получите текущий адрес
var url = window.location.href
Затем просто проанализируйте эту строку
var arr = url.split("/");
ваш URL:
var result = arr[0] + "//" + arr[2]
Надеюсь, что это поможет
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
Похоже, что ни один из этих ответов полностью не отвечает на вопрос, который требует произвольного URL, а не конкретно URL текущей страницы.
Вы можете использовать URL API (не поддерживается IE11, но доступно везде).
Это также упрощает доступ к параметрам поиска. Еще один бонус: его можно использовать в Web Worker, поскольку он не зависит от DOM.
const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');
Используйте это, если вам это нужно, чтобы работать и в старых браузерах.
// Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
// Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');
Встроенный в браузер парсер уже сделал свою работу. Теперь вы можете просто взять нужные вам части (обратите внимание, что это работает для обоих методов выше):
// Get any piece of the url you're interested in
url.hostname; // 'example.com'
url.port; // 12345
url.search; // '?startIndex=1&pageSize=10'
url.pathname; // '/blog/foo/bar'
url.protocol; // 'http:'
Скорее всего, вам, вероятно, захочется разбить также и параметры URL-адреса поиска, поскольку "? StartIndex = 1 & pageSize = 10" не слишком полезен сам по себе.
Если вы использовали метод 1 (URL API) выше, вы просто используете геттеры searchParams:
url.searchParams.get('startIndex'); // '1'
Или получить все параметры:
Array
.from(url.searchParams)
.reduce((accum, [key, val]) => {
accum[key] = val;
return accum;
}, {});
// -> { startIndex: '1', pageSize: '10' }
Если вы использовали метод 2 (по-старому), вы можете использовать что-то вроде этого:
// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
.split('&')
.reduce((accum, keyval) => {
const [key, val] = keyval.split('=');
accum[key] = val;
return accum;
}, {});
// -> { startIndex: '1', pageSize: '10' }
По какой-то причине все ответы - все излишества. Это все, что нужно:
window.location.origin
Более подробную информацию можно найти здесь: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties
Как уже упоминалось, существует еще не полностью поддерживаемая window.location.origin
, но вместо того, чтобы использовать ее или создавать новую переменную для использования, я предпочитаю ее проверять и если она не установлена для ее установки.
Например:
if (!window.location.origin) {
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
Я на самом деле написал об этом несколько месяцев назад Исправление для window.location.origin
хост
var url = window.location.host;
возвращает localhost:2679
имя хоста
var url = window.location.hostname;
возвращает localhost
window.location.origin
будет достаточно, чтобы получить то же самое.
Свойство протокола устанавливает или возвращает протокол текущего URL-адреса, включая двоеточие (:).
Это означает, что если вы хотите получить только часть HTTP/HTTPS, вы можете сделать что-то вроде этого:
var protocol = window.location.protocol.replace(/:/g,'')
Для домена, который вы можете использовать:
var domain = window.location.hostname;
Для порта вы можете использовать:
var port = window.location.port;
Имейте в виду, что порт будет пустой строкой, если он не отображается в URL-адресе. Например:
Если вам нужно показать 80/443, когда у вас нет использования порта
var port = window.location.port || (protocol === 'https' ? '443' : '80');
Действительно, window.location.origin отлично работает в браузерах, следуя стандартам, но угадайте, что. IE не соответствует стандартам.
Итак, из-за этого, это то, что сработало для меня в IE, FireFox и Chrome:
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
но для возможных будущих улучшений, которые могут вызвать конфликты, я указывал ссылку "окно" перед объектом "location".
var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);
var getBasePath = function(url) {
var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
return r ? r[0] : '';
};
Попробуйте использовать регулярное выражение (Regex), которое будет весьма полезно, если вы хотите проверить/извлечь материал или даже выполнить простой анализ в javascript.
Регулярное выражение:
/([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/
Демонстрация:
function breakURL(url){
matches = /([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/.exec(url);
foo = new Array();
if(matches){
for( i = 1; i < matches.length ; i++){ foo.push(matches[i]); }
}
return foo
}
url = "https://www.google.co.uk:55699/search?q=http%3A%2F%2F&oq=http%3A%2F%2F&aqs=chrome..69i57j69i60l3j69i65l2.2342j0j4&sourceid=chrome&ie=UTF-8"
breakURL(url); // [https, www.google.co.uk, 55699]
breakURL(); // []
breakURL("asf"); // []
breakURL("asd://"); // []
breakURL("asd://a"); // [asd, a, undefined]
Теперь вы можете сделать валидацию.
Вот решение, которое я использую:
const result = '${ window.location.protocol }//${ window.location.host }';
РЕДАКТИРОВАТЬ:
Чтобы добавить кросс-браузерную совместимость, используйте следующее:
const result = '${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }';
Простой ответ, который работает для всех браузеров:
let origin;
if (!window.location.origin) {
origin = window.location.protocol + "//" + window.location.hostname +
(window.location.port ? ':' + window.location.port: '');
}
origin = window.location.origin;
Ответ Дэвида большой и очень всеобъемлющий, но не будет работать с javascript на стороне сервера из-за вызовов document.createElement(документ не будет определен).
Я написал простой компонент который охватывает произвольные URL-адреса на сервере или в браузере и анализирует их на объект. Вы можете использовать parseUrl(), как показано ниже, чтобы получить базовый url и порт без строки пути или запроса:
var url = 'https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer';
var urlObject = parseUrl(url);
var newUrl = urlObject.protocol + '//' + urlObject.host;
Подобно методу Дэвида, это также предоставляет все части URL-адреса в объекте url.
urlObject.href // 'https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer'
urlObject.searchParams // { lang: 'it', report_type: 'consumer' }
urlObject.hash // ''
urlObject.search // '?lang=it&report_type=consumer'
urlObject.protocol // 'https:'
urlObject.host // 'localhost:8181'
urlObject.hostname // 'localhost'
urlObject.path // '/ContactUs-1.0/contact'
Не забудьте импортировать компонент для использования метода parseUrl.
/**
* Get the current URL from 'window' context object.
* Will return the fully qualified URL if neccessary:
* getCurrentBaseURL(true, false) // 'http://localhost/' - 'https://localhost:3000/'
* getCurrentBaseURL(true, true) // 'http://www.example.com' - 'https://www.example.com:8080'
* getCurrentBaseURL(false, true) // 'www.example.com' - 'localhost:3000'
*
* @param {boolean} [includeProtocol=true]
* @param {boolean} [removeTrailingSlash=false]
* @returns {string} The current base URL.
*/
export const getCurrentBaseURL = (includeProtocol = true, removeTrailingSlash = false) => {
if (!window || !window.location || !window.location.hostname || !window.location.protocol) {
console.error(
'The getCurrentBaseURL function must be called from a context in which window object exists. Yet, window is ${window}',
[window, window.location, window.location.hostname, window.location.protocol],
)
throw new TypeError('Whole or part of window is not defined.')
}
const URL = '${includeProtocol ? '${window.location.protocol}//' : ''}${window.location.hostname}${
window.location.port ? ':${window.location.port}' : ''
}${removeTrailingSlash ? '' : '/'}'
// console.log('The URL is ${URL}')
return URL
}
Почему бы не использовать:
let full = window.location.origin
window.location.protocol + '//' + window.location.host
window.location.protocol + "//" + window.location.hostname + ":" + window.location.port