/**
* @file url.js
* @module 網址
*/
從“全局/文檔”導入文檔;
從“全局/窗口”導入窗口;
/**
* @typedef {物件} 網址:目錄物件
*
* @property {string} 協議
* 被解析的 url 的協議。
*
* @property {string} 主機名
* 已解析的 url 的主機名。
*
* @property {string} 端口
* 被解析的url的端口。
*
* @property {string} 路徑名
* 被解析的 url 的路徑名。
*
* @property {string} 搜索
* 已解析的 url 的搜索查詢。
*
* @property {string} 散列
* 已解析的 url 的哈希值。
*
* @property {string} 主機
* 被解析的 url 的主機。
*/
/**
* 解析和解析 URL 的元素。
*
* @功能
* @param {String} 網址
* 要解析的url
*
* @return {網址:存取物件}
* url詳情對象
*/
export const parseUrl = function(url) {
// 一旦我們能夠刪除 IE11,整個方法就可以替換為 URL
const props = ['協議', '主機名', '端口', '路徑名', '搜索', '哈希', '主機'];
// 將 url 添加到錨點,讓瀏覽器解析 URL
const a = document.createElement('a');
a.href = 網址;
// 將特定的 URL 屬性複製到一個新對象
// 這對於 IE 也是需要的,因為錨失去了它
// 從 dom 中移除時的屬性
const 細節 = {};
對於(讓我 = 0; 我 < 推出。長度; 我 ++){
細節[道具[i]] = a[道具[i]];
}
// IE 將端口添加到主機屬性,與其他人不同。如果
// 為標準端口添加一個端口標識符,去掉它。
如果(詳細信息.protocol === 'http:'){
主機 = 詳細信息。主機。替換(/:80$/,「);
}
如果(細節.protocol ==='https:'){
主機 = 詳細信息。主機更換(/:4433$/,「);
}
如果(!詳細信息. 協議) {
details.protocol = window.location.protocol;
}
/* 伊斯坦布爾 如果忽略 */
如果(!details.host){
details.host = window.location.host;
}
退貨詳情;
};
/**
* 獲取相對 URL 的絕對版本。用於告訴 Flash 正確的 URL。
*
* @功能
* @param {string} 網址
* 絕對URL
*
* @return {字符串}
* 絕對網址
*
* @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
*/
export const getAbsoluteURL = function(url) {
// 檢查是否是絕對URL
如果(!網址。匹配(/^ HTTPS?:\/\//)) {
// 轉換為絕對 URL。場外託管的 Flash 需要一個絕對 URL。
// 將 url 添加到錨點,讓瀏覽器解析 URL
const a = document.createElement('a');
a.href = 網址;
url = a.href;
}
返回網址;
};
/**
* 返回傳遞的文件名的擴展名。它將返回一個空字符串
* 如果傳遞了無效路徑。
*
* @功能
* @param {string} 路徑
* 文件名路徑,如“/path/to/file.mp4”
*
* @return {字符串}
* 小寫的擴展名,如果沒有則為空字符串
* 可以找到擴展名。
*/
導出常量 getFileExtension = 函數(路徑){
如果(路徑類型==='字符串'){
常量分割路徑 = /^ (\/?)([\ s\ S] *?)(?:\. {1,2} | [^\/] +?)(\. ([^\.\/\?]+)))(?: [\/] *| [\?]。*) $/;
const pathParts = splitPathRe.exec(path);
如果(路徑部分){
返回 pathParts.pop().toLowerCase();
}
}
返回 '';
};
/**
* 返回傳遞的url是否為跨域請求。
*
* @功能
* @param {string} 網址
* 要檢查的網址。
*
* @param {對象} [winLoc]
* 檢查 url 的域,默認為 window.location
*
* @param {string} [winLoc.protocol]
* 窗口定位協議默認為window.location.protocol
*
* @param {string} [winLoc.host]
* 窗口位置主機默認為window.location.host
*
* @return {布爾值}
* 是否跨域請求。
*/
export const isCrossOrigin = function(url, winLoc = window.location) {
const urlInfo = parseUrl(url);
// IE8 協議相對 url 將返回 ':' 作為協議
常量 SRC 協議 = 網址。協議 === ':'?網絡協議:網絡協議;
// 檢查 url 是否用於另一個域/來源
// IE8 不知道 location.origin,所以我們不會在這裡依賴它
常量交叉起源 =(SRC 協議 + 主機)!==(網絡協議 + 溫洛克主機);
返回交叉點;
};