ฉันต้องการแยกโพรโทคอลโดเมนและพอร์ตทั้งหมดจาก URL ที่กำหนด ตัวอย่างเช่น:
https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
ฉันต้องการแยกโพรโทคอลโดเมนและพอร์ตทั้งหมดจาก 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]
หวังว่านี่จะช่วยได้
location
วัตถุไม่พร้อมใช้งาน (js นอกเบราว์เซอร์!)
location
) แต่สามารถใช้กับurl ใดก็ได้ ตรวจสอบว่ามันเรียบร้อย
window.location.href.split('/').slice(0, 3).join('/')
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
about://
คุณจะได้รับ อย่างไรก็ตามฉันอยากรู้ว่าจะใช้กรณีabout:blank
อะไร ฉันไม่แน่ใจว่าเบราว์เซอร์ใด ๆ ฉีดทรัพยากรปลั๊กอินเข้าไปabout:blank
หรือไม่ แต่ดูเหมือนว่าจะเป็นกรณีการใช้งานเท่านั้น
location
นี่เพื่อทำงาน)
location.host
แทนlocation.hostname
+ location.port
ไม่ได้ใช่ไหม
ดูเหมือนว่าจะไม่มีคำตอบใดที่จะตอบคำถามนี้อย่างสมบูรณ์ซึ่งเรียกร้องให้มี url ที่กำหนดเองไม่ใช่ url ของหน้าปัจจุบันโดยเฉพาะ
คุณสามารถใช้URL API (ไม่รองรับโดย IE11 แต่ใช้ได้ทุกที่ )
นอกจากนี้ยังช่วยให้เข้าถึงparams การค้นหาได้ง่าย โบนัสอื่น: สามารถใช้ใน 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');
parser ในตัวของเบราว์เซอร์ทำงานแล้ว ตอนนี้คุณสามารถคว้าชิ้นส่วนที่คุณต้องการได้ (โปรดทราบว่าวิธีนี้ใช้ได้กับทั้งสองวิธีข้างต้น):
// 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:'
โอกาสที่คุณอาจจะต้องการแยกพารามิเตอร์การค้นหาด้วยเช่นกันเนื่องจาก '? startIndex = 1 & pageSize = 10' ไม่สามารถใช้งานได้ด้วยตัวเอง
หากคุณใช้วิธีที่ 1 (URL API) ด้านบนคุณเพียงใช้ searchParams getters:
url.searchParams.get('startIndex'); // '1'
หรือเพื่อรับพารามิเตอร์ทั้งหมด:
function searchParamsToObj(searchParams) {
const paramsMap = Array
.from(url.searchParams)
.reduce((params, [key, val]) => params.set(key, val), new Map());
return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { 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' }
var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
http
หน้ากระดาษหรือเปล่า? หากไม่ได้ระบุจะเป็นการ 'รับช่วง' จากตำแหน่งปัจจุบัน
host
hostname
อดีตรวมถึงพอร์ต (เช่นlocalhost:3000
) ในขณะที่หลังเป็นเพียงชื่อโฮสต์ (เช่นlocalhost
)
ด้วยเหตุผลบางอย่างคำตอบทั้งหมดเป็น overkills ทั้งหมด นี่คือทั้งหมดที่ใช้:
window.location.origin
รายละเอียดเพิ่มเติมสามารถดูได้ที่นี่: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties
URLUtils
อินเทอร์เฟซที่กำหนดไว้ใน WHATWGและรวมถึงorigin
แอตทริบิวต์
ตามที่ได้รับการกล่าวถึงแล้วมียังไม่ได้รับการสนับสนุนอย่างเต็มที่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
window.location.origin
มีอยู่จริง ขอบคุณ. ^^
เจ้าภาพ
var url = window.location.host;
ผลตอบแทน localhost:2679
ชื่อโฮสต์
var url = window.location.hostname;
ผลตอบแทน localhost
localhost/
localhost:3000
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');
ทำไมไม่ใช้:
let full = window.location.origin
แท้จริงแล้วwindow.location.originทำงานได้ดีในเบราว์เซอร์ตามมาตรฐาน แต่คาดเดาสิ่งที่ IE ไม่ได้เป็นไปตามมาตรฐาน
ดังนั้นด้วยเหตุนี้สิ่งที่ได้ผลสำหรับฉันใน IE, FireFox และ Chrome:
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
แต่สำหรับการปรับปรุงในอนาคตที่เป็นไปได้ซึ่งอาจทำให้เกิดข้อขัดแย้งฉันได้ระบุการอ้างอิง "หน้าต่าง" ก่อนวัตถุ "ตำแหน่ง"
var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');
นี่คือทางออกที่ฉันใช้:
const result = `${ window.location.protocol }//${ window.location.host }`;
แก้ไข:
ในการเพิ่มความเข้ากันได้ข้ามเบราว์เซอร์ให้ใช้สิ่งต่อไปนี้:
const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;
window.location.host
อาจไม่ใช่เบราว์เซอร์ที่ดีที่สุด
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
regex คือ:
/([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]
ตอนนี้คุณสามารถตรวจสอบได้เช่นกัน
คำตอบง่ายๆที่ใช้ได้กับเบราว์เซอร์ทั้งหมด:
let origin;
if (!window.location.origin) {
origin = window.location.protocol + "//" + window.location.hostname +
(window.location.port ? ':' + window.location.port: '');
}
origin = window.location.origin;
/**
* 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
}
window.location.protocol + '//' + window.location.host