/**
* https://joswlv.github.io/2016/11/03/CORS/
* https://www.tutorialspoint.com/converting-images-to-a-base64-data-url-using-javascript
* image url => base64 url로 변환하기
* @param {String} src : 이미지 url
*/
function getDataUrl(src) {
const image = new Image();
image.crossOrigin = 'Anonymous';
// 캔버스 생성
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// 이미지가 로드되면 실행될 콜백 함수
image.onload = function () {
canvas.width = image.width;
canvas.height = image.height;
// 캔버스에 이미지를 그린다.
ctx.drawImage(image, 0, 0);
// 변환된 base64 이미지 URL
const dataUrl = canvas.toDataURL('image/png');
};
// 이미지 src 설정하는 동시에 로드 시작
image.src = src;
// make sure the load event fires for cached images too
if (image.complete || image.complete === undefined) {
image.src =
'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
image.src = src;
}
}
/**
* dataURL로 변경된 이미지 다운로드
* @param uri : 이미지 url
* @param name : string : 파일 명
*/
function downloadURI(uri, fileName) {
const link = document.createElement('a');
link.download = fileName; // 파일 이름 지정
link.href = uri;
document.body.appendChild(link);
link.click();
link.parentNode.removeChild(link); // 추가한 a 태그 삭제
}
function loadScript(url, callback)
{
var head = document.head;
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
script.onreadystatechange = callback;
script.onload = callback;
head.appendChild(script);
}
/**
* 입력한 날짜가 yyyy-MM-dd이고, 올바른 날짜인지 체크
* @param {string} dateString
*/
function fnIsValidDate(dateString) {
var regEx = /^\d{4}-\d{2}-\d{2}$/;
if(!dateString.match(regEx)) return false;
var d = new Date(dateString);
var dNum = d.getTime();
if(!dNum && dNum !== 0) return false;
return d.toISOString().slice(0,10) === dateString;
}
// https://stackoverflow.com/questions/726761/javascript-open-in-a-new-window-not-tab
window.open(url, windowName, "height=200,width=200");
: https://sub0709.tistory.com/126
// 1. URLSearchParams 객체 생성
const url = new URLSearchParams(window.location.search);
// 2. 값 가져오기
url.get('movieId') // 123
: 배열을 합쳐서 새로운 배열을 반환하는 메서드
const array1 = ['a', 'b', 'd'];
const array2 = ['c', 'e', 'f'];
const array3 = array1.concat(array2); // [ a,b,d,c,e,f ];
const _selectedIndex = 1;
array.splice(_selectedIndex, 1);
1) Array.prototype.findIndex
: 주어진 조건을 만족하는 배열의 첫 번째 아이템을 반환한다. 조건에 맞는 아이템이 없으면 -1을 반환한다.
: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
// 시작 시점 체크
let startTime = null;
// setInterval 타이머
let timer = null;
// 3000ms, 3초
const delay = 3000;
// 특정 엘리먼트에 마우스 오버시 시간 카운트
$element.onmouseover = function(event) {
// 1.
startTime = new Date().getTime();
// 500ms(0.5s) 마다 시간을 체크
timer = setInterval(() => {
// 2.
const elapsed = new Date().getTime() - startTime;
// 3.
if( elapsed >= delay ) {
// 4.
clearInterval(timer);
alert('End!!!');
}
}, 500);
}
- 시작 시간을 설정한다. getTime()은 ms단위 이므로 초 단위를 구하고 싶으면 1000으로 나눠줘야한다.
- 500ms마다 현재 시간에서 시작 시간을 빼서 경과한 시간을 변수에 담는다.
- 3초 이상 경과했을 경우를 if문을 통해서 체크한다.
- clearInterval()을 통해서 타이머를 강제 종료한다.
function getOffset(element) {
// 1.
const clientRect = element.getBoundingClientRect();
const relativeTop = clientRect.top;
const relativeLeft = clientRect.left;
//2.
const top = (pageYOffset || scrollY) + relativeTop;
const left = (pageXOffset || scrollX) + relativeLeft;
return {
top,
left,
width: clientRect.width,
height: clientRect.height,
};
}
getBoundingClientRect
를 통해서 Viewport에 상대적인 top, left와 엘리먼트의 높이 너비를 구한다.- viewport기준이 아닌 브라우저 컨텐츠를 기준으로한 x, y 좌표 값을 구한다.
😎 엘리먼트의 Y절대 좌표 = 브라우저가 세로로 스크롤된 거리 + 뷰포트 기준 y좌표
var $this = $(this);
var offset = $this.offset();
var width = $this.width();
var height = $this.height();
var centerX = offset.left + width / 2;
var centerY = offset.top + height / 2;
division(arr, n) {
var len = arr.length;
var cnt = Math.floor(len / n);
var tmp = [];
for (var i = 0; i <= cnt; i++) {
tmp.push(arr.splice(0, n));
}
return tmp;
},
for(const el in slider) {
if(slider[el].nodeName) {
if(slider[el].className.indexOf("swiper-slide-active") >= 0) {
// this.$refs['slider__nav__inner'].style.left = `${12.5 * slider[el].getAttribute("data-swiper-slide-index")}vw`;
this.$refs['slider__nav__inner'].style.left = `${navWidth * slider[el].getAttribute("data-swiper-slide-index")}px`;
break;
}
}
}
var entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=' };
function escapeHtml (string) { return String(string).replace(/[&<>"'`=\/]/g, function (s) { return entityMap[s]; }); }
: https://ko.javascript.info/cookie
// 지금으로부터 하루 후
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = "user=John; expires=" + date;
: https://stackoverflow.com/questions/14573223/set-cookie-and-get-cookie-with-javascript
// 브라우저 쿠키 생성
function setCookie(name,value,days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
// 브라우저 쿠키 가져오기
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
// 브라우저 쿠키 삭제하기
function eraseCookie(name) {
document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
: this 값은 호출 시점에 결정됩니다.!!!!!!!!!!!!!!!!!
var d = new Date();
d.setHours(0,0,0,0);
: https://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page
: https://developer.mozilla.org/ko/docs/Web/API/History/replaceState
history.replaceState(this.filterData(), null,"?" + url.toString());
: https://developer.mozilla.org/ko/docs/Web/API/Element/scrollIntoView
// element === 포커싱 할 엘리먼트
element.scrollIntoView();
<a href="javascript:;"></a>
href="javascript:;"
를 삽입하면 a태그의 기본 동작을 막을 수 있다.
: https://stackoverflow.com/questions/23373990/window-open-simply-adds-the-url-to-my-current-url
const domain = 'https://' + window.location.hostname;
const path = '/somePage';
const url = domain + path;
window.open(url, '', true);
3번째 인자를 전달해 주어야지 새 창으로 열 수 있다.
element.scrollIntoView({
behavior: "smooth",
inline: "start",
block: "nearest"
});
// currentPath === /pc/events/ => ['', 'pc', 'events', ''] => ['pc', 'events']
const currentPath = location.pathname.split('/').filter(path => !!path);
const target = currentPath[currentPath.length - 1];
// if(!(d instanceof Date)) 도 가능하다.
if (Object.prototype.toString.call(d) === "[object Date]") {
// it is a date
if (isNaN(d.getTime())) { // d.valueOf() could also work
// date is not valid
} else {
// date is valid
}
} else {
// not a date
}