/**
* @파일 url.js
* @모듈 URL
*/
'글로벌/문서'에서 문서 가져오기;
'글로벌/창'에서 창 가져오기;
/**
* @typedef {객체} url:URL객체
*
* @property {문자열} 프로토콜
* 구문 분석된 URL의 프로토콜입니다.
*
* @property {문자열} 호스트 이름
* 구문 분석된 URL의 호스트 이름입니다.
*
* @property {문자열} 포트
* 구문 분석된 URL의 포트입니다.
*
* @property {문자열} 경로명
* 구문 분석된 URL의 경로 이름입니다.
*
* @property {문자열} 검색
* 파싱된 URL의 검색 쿼리입니다.
*
* @property {문자열} 해시
* 구문 분석된 URL의 해시입니다.
*
* @property {문자열} 호스트
* 구문 분석된 URL의 호스트입니다.
*/
/**
* URL의 요소를 해결하고 구문 분석합니다.
*
* @기능
* @param {문자열} URL
* 파싱할 URL
*
* @return {url:URL객체}
* url 상세정보 객체
*/
내보내기 const parseUrl = function(url) {
// IE11을 삭제할 수 있게 되면 이 전체 메서드를 URL로 대체할 수 있습니다.
const props = ['프로토콜', '호스트 이름', '포트', '경로 이름', '검색', '해시', '호스트'];
// 앵커에 URL을 추가하고 브라우저가 URL을 구문 분석하도록 합니다.
const a = document.createElement('a');
a.href = URL;
// 특정 URL 속성을 새 개체에 복사
// IE에도 앵커가 손실되기 때문에 필요합니다.
// dom에서 제거될 때의 속성
const 세부 정보 = {};
에 대한 (하자 i = 0; i < 소품.길이; i++) {
세부사항[props[i]] = a[props[i]];
}
// IE는 다른 사람과 달리 호스트 속성에 포트를 추가합니다. 만약에
// 표준 포트에 포트 식별자가 추가되면 제거합니다.
if (details.protocol === 'http:') {
details.host = details.host.replace(/:80$/, '');
}
if (details.protocol === 'https:') {
세부사항.호스트 = 세부사항.호스트.대체(/:443$/, '');
}
if (!details.protocol) {
details.protocol = window.location.protocol;
}
/* istanbul if 무시 */
if (!details.host) {
세부사항.호스트 = 창.위치.호스트;
}
반환 세부 정보;
};
/**
* 상대 URL의 절대 버전을 가져옵니다. Flash에 올바른 URL을 알려주는 데 사용됩니다.
*
* @기능
* @param {문자열} URL
* URL을 절대화
*
* @return {문자열}
* 절대 URL
*
* @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
*/
내보내기 const getAbsoluteURL = 함수(url) {
// 절대 URL인지 확인
if (!url.match(/^https?:\/\//)) {
// 절대 URL로 변환합니다. 외부에서 호스팅되는 Flash에는 절대 URL이 필요합니다.
// 앵커에 URL을 추가하고 브라우저가 URL을 구문 분석하도록 합니다.
const a = document.createElement('a');
a.href = URL;
url = a.href;
}
반환 URL;
};
/**
* 전달된 파일 이름의 확장자를 반환합니다. 빈 문자열을 반환합니다
* 유효하지 않은 경로를 전달한 경우.
*
* @기능
* @param {문자열} 경로
* '/path/to/file.mp4'와 같은 파일 이름 경로
*
* @return {문자열}
* 소문자의 확장자 또는 없는 경우 빈 문자열
* 확장자를 찾을 수 있습니다.
*/
내보내기 const getFileExtension = 함수(경로) {
if (경로 유형 === '문자열') {
const splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/ \?]+)))(?:[\/]*|[\?].*)$/;
const pathParts = splitPathRe.exec(경로);
if (경로 부분) {
return pathParts.pop().toLowerCase();
}
}
반품 '';
};
/**
* 전달된 URL이 교차 도메인 요청인지 여부를 반환합니다.
*
* @기능
* @param {문자열} URL
* 확인할 URL입니다.
*
* @param {객체} [winLoc]
* URL을 확인할 도메인, 기본값은 window.location
*
* @param {문자열} [winLoc.protocol]
* 창 위치 프로토콜의 기본값은 window.location.protocol입니다.
*
* @param {문자열} [winLoc.호스트]
* 창 위치 호스트는 기본적으로 window.location.host입니다.
*
* @return {부울}
* 교차 도메인 요청인지 여부.
*/
내보내기 const isCrossOrigin = function(url, winLoc = window.location) {
const urlInfo = parseUrl(url);
// IE8 프로토콜 상대 URL은 프로토콜에 대해 ':'을 반환합니다.
const srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;
// URL이 다른 도메인/출처인지 확인
// IE8은 location.origin을 알지 못하므로 여기에서는 의존하지 않습니다.
const crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);
crossOrigin 반환;
};