navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } }).then(stream => {
video.srcObject = stream;
video.setAttribute('playsinline', true);
video.play();
requestAnimationFrame(tick);
});
카메라 접근 권한 요청, 스트림을 video
요소의 소스로 설정합니다. 비디오 재생 tick
반복 호출
navigator.mediaDevices.getUserMedia
= 브라우저에서 사용자에게 미디어 스트림 제공
function tick() {
if (video.readyState === video.HAVE_ENOUGH_DATA) {
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
context.drawImage(video, 0, 0, canvas.width, canvas.height);
const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
const code = jsQR(imageData.data, imageData.width, imageData.height, {
inversionAttempts: 'dontInvert',
});
if (code) {
resultElement.textContent = `QRC 데이터: ${code.data}`;
} else {
resultElement.textContent = 'QRC 없음';
}
}
requestAnimationFrame(tick);
}
비디오 데이터 로드되면 캔버스에 뿌린다 QR 코드를 디코딩
generateButton.addEventListener('click', () => {
const text = textInput.value;
qrCodeContainer.innerHTML = '';
QRCode.toCanvas(text, { width: 200, margin: 2 }, (error, canvas) => {
if (error) {
console.error(error);
return;
}
qrCodeContainer.appendChild(canvas);
});
});
입력된 텍스트를 QR 코드로 변환
saveButton.addEventListener('click', () => {
const text = textInput.value;
if (!text) {
alert('QR입력');
return;
}
let savedQRCodes = JSON.parse(localStorage.getItem('savedQRCodes')) || [];
savedQRCodes.push(text);
localStorage.setItem('savedQRCodes', JSON.stringify(savedQRCodes));
alert('QR 저장됨');
});
로컬 스토리지에 저장
showSavedButton.addEventListener('click', () => {
savedQRCodesContainer.innerHTML = '';
let savedQRCodes = JSON.parse(localStorage.getItem('savedQRCodes')) || [];
if (savedQRCodes.length === 0) {
savedQRCodesContainer.textContent = '저장안됨';
return;
}
savedQRCodes.forEach((code, index) => {
const div = document.createElement('div');
div.classList.add('qrCodeItem');
const qrCodeData = document.createElement('p');
qrCodeData.classList.add('qrCodeData');
qrCodeData.textContent = code;
const deleteButton = document.createElement('button');
deleteButton.classList.add('deleteButton');
deleteButton.textContent = '삭제';
deleteButton.addEventListener('click', () => {
deleteQRCode(index);
});
const shareButton = document.createElement('button');
shareButton.classList.add('shareButton');
shareButton.textContent = '공유';
shareButton.addEventListener('click', () => {
shareQRCode(code);
});
QRCode.toCanvas(code, { width: 200, margin: 2 }, (error, canvas) => {
if (error) {
console.error(error);
return;
}
div.appendChild(canvas);
});
div.appendChild(qrCodeData);
div.appendChild(deleteButton);
div.appendChild(shareButton);
savedQRCodesContainer.appendChild(div);
});
});
savedQRCodesContainer
의 기존 내용 제거localStorage
제한된 저장 용량:
도메인 기반 저장:
키-값 쌍 저장:
빠른 조회:
저장 위치와 생명 주기:
데이터 용량:
데이터 형식:
범위 및 접근성:
// 저장
localStorage.setItem('key', 'value');
// 불러오기
const value = localStorage.getItem('key');
// 삭제
localStorage.removeItem('key');
// 모든 데이터 삭제
localStorage.clear();
// JavaScript Map
const map = new Map();
// 저장
map.set('key', 'value');
// 불러오기
const value = map.get('key');
// 삭제
map.delete('key');
// 모든 데이터 삭제
map.clear();
함수 내부에서의 예제
function sayHello() {
console.log("Hello, " + this.name + "!")
}
var person = {
name: "이지민",
sayHello: sayHello
};
var person2 = {
name: "리짜이밍",
sayHello: sayHello
};
person.sayHello();
person2.sayHello();
//Hello, 이지민!
//Hello, 리짜이밍!
객체에서 메소드를 호출할때 예제
var car = {
make: "HYUNDAI",
model: "ionic",
year: "2024",
getCarInfo: function() {
return this.make + " " + this.model + " (" + this.year + ")";
}
};
console.log(car.getCarInfo());
//HYUNDAI ionic (2024)
[[프로미스 설명.canvas|프로미스 설명]]
fetchData()
.then(result => {
// 성공 시 실행할 코드
console.log('Success:', result);
})
.catch(error => {
// 실패 시 실행할 코드
console.error('Error:', error);
});
SDP : 생성할 세션의 타입의 정보를 전송 ![[Pasted image 20240520122248.png]]