728x90

Pointer Lock API는 캔버스나 게임 창과 같은 웹 페이지의 특정 요소에 마우스 커서를 고정할 수 있는 JavaScript API입니다. 이는 게임, 몰입형 경험 또는 정확한 마우스 제어가 중요한 기타 애플리케이션에 유용할 수 있습니다.

다음은 Pointer Lock API를 사용하는 방법의 예입니다.

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Pointer Lock API Example</title>

<style>

#gameCanvas {

width: 640px;

height: 480px;

background-color: #000000;

}

</style>

</head>

<body>

<canvas id="gameCanvas"></canvas>

<script>

var canvas = document.getElementById("gameCanvas");

var context = canvas.getContext("2d");

// Lock the mouse pointer to the canvas

canvas.requestPointerLock = canvas.requestPointerLock ||

canvas.mozRequestPointerLock ||

canvas.webkitRequestPointerLock;

canvas.requestPointerLock();

// Add event listeners to handle mouse movement

document.addEventListener("mousemove", handleMouseMove, false);

document.addEventListener("pointerlockchange", handlePointerLockChange, false);

document.addEventListener("webkitpointerlockchange", handlePointerLockChange, false);

document.addEventListener("mozpointerlockchange", handlePointerLockChange, false);

// Function to handle mouse movement

function handleMouseMove(event) {

// Check if the mouse pointer is locked

if (document.pointerLockElement === canvas ||

document.mozPointerLockElement === canvas ||

document.webkitPointerLockElement === canvas) {

// Update the canvas based on the mouse movement

var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;

var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;

context.fillStyle = "#ffffff";

context.fillRect(movementX, movementY, 5, 5);

}

}

// Function to handle changes in pointer lock state

function handlePointerLockChange(event) {

if (document.pointerLockElement === canvas ||

document.mozPointerLockElement === canvas ||

document.webkitPointerLockElement === canvas) {

console.log("Mouse locked to canvas.");

} else {

console.log("Mouse unlocked from canvas.");

}

}

</script>

</body>

</html>

이 예제에는 ID가 "gameCanvas"인 캔버스 요소가 있습니다. 먼저 `requestPointerLock()` 메서드를 사용하여 이 캔버스에서 포인터 잠금을 요청합니다. 그런 다음 이벤트 리스너를 추가하여 마우스 이동 및 포인터 잠금 상태의 변경을 처리합니다.

`handleMouseMove()` 함수는 포인터가 캔버스에 잠겨 있는 동안 마우스를 움직일 때마다 호출됩니다. `pointerLockElement` 속성을 사용하여 포인터가 잠겨 있는지 확인한 다음 마우스 움직임을 기반으로 캔버스를 업데이트합니다.

`handlePointerLockChange()` 함수는 포인터 잠금 상태가 변경될 때마다 호출됩니다. 캔버스가 현재 포인터 잠금 요소인지 확인한 다음 마우스가 잠겨 있는지 또는 잠금 해제되었는지를 나타내는 메시지를 콘솔에 기록합니다.

Pointer Lock API는 모든 브라우저에서 지원되지 않으므로 애플리케이션에서 사용하기 전에 지원 여부를 확인해야 합니다.

728x90
728x90

Presentation API는 웹 개발자가 프로젝터, TV 또는 기타 화면과 같은 외부 프레젠테이션 디스플레이를 연결하고 제어할 수 있는 웹 애플리케이션을 만들 수 있는 JavaScript API입니다. Presentation API는 외부 디스플레이를 검색 및 선택하고 외부 디스플레이에 콘텐츠를 보내는 표준화된 방법을 제공합니다.

다음은 프레젠테이션 API를 사용하는 방법에 대한 간단한 예입니다.

<!DOCTYPE html>

<html>

<head>

<title>Presentation API Example</title>

<script>

// Request a presentation session

function requestPresentation() {

navigator.presentation.request()

.then((presentation) => {

console.log('Connected to presentation:', presentation.url);

presentation.onclose = () => {

console.log('Presentation closed');

};

presentation.onmessage = (event) => {

console.log('Received message:', event.data);

};

// Send a message to the presentation display

presentation.send('Hello from the web app!');

})

.catch((error) => {

console.error('Failed to connect to presentation:', error);

});

}

</script>

</head>

<body>

<button onclick="requestPresentation()">Connect to Presentation</button>

</body>

</html>

이 예제에서는 `navigator.presentation.request()` 메서드를 사용하여 프레젠테이션 세션을 요청하는 `requestPresentation()` 함수를 정의합니다. 세션이 설정되면 프레젠테이션 디스플레이에 연결되었음을 나타내는 메시지를 콘솔에 기록합니다. 또한 프레젠테이션 객체의 `onclose` 및 `onmessage` 이벤트에 대한 이벤트 리스너를 설정합니다. 마지막으로 `Presentation.send()` 메서드를 사용하여 프레젠테이션 디스플레이에 메시지를 보냅니다.

프레젠테이션 API를 사용하려면 웹 앱이 HTTPS를 통해 제공되어야 하며 프레젠테이션 디스플레이도 API를 지원해야 합니다.

다음은 프레젠테이션 API를 사용하여 간단한 프레젠테이션 디스플레이를 만드는 방법의 예입니다.

<!DOCTYPE html>

<html>

<head>

<title>Presentation Display Example</title>

<script>

// Listen for incoming presentation connections

navigator.presentation.defaultSession.onconnect = (event) => {

console.log('Presentation connected');

const presentation = event.receiver;

presentation.onmessage = (event) => {

console.log('Received message:', event.data);

};

presentation.onclose = () => {

console.log('Presentation closed');

};

// Send a message to the web app

presentation.send('Hello from the presentation display!');

};

</script>

</head>

<body>

<h1>This is the presentation display</h1>

</body>

</html>

이 예제에서는 `navigator.presentation.defaultSession.onconnect` 이벤트 리스너를 사용하여 들어오는 프레젠테이션 연결을 수신합니다. 연결이 설정되면 프레젠테이션이 연결되었음을 나타내는 메시지를 콘솔에 기록합니다. 프레젠테이션 객체의 `onmessage` 및 `onclose` 이벤트에 대한 이벤트 리스너를 설정합니다. 마지막으로 `Presentation.send()` 메서드를 사용하여 웹 앱에 메시지를 다시 보냅니다.

이 예제에서는 웹 앱과 프레젠테이션 디스플레이가 서로 다른 장치에서 호스팅되고 프레젠테이션 디스플레이에는 Presentation API를 사용하여 웹 앱에서 검색할 수 있는 고유한 URL이 있다고 가정합니다.

728x90
728x90

`TaskQueue` API라고도 하는 JavaScript의 Prioritized Task Scheduling API를 사용하면 개발자가 지정된 순서와 우선 순위에 따라 실행할 작업을 예약할 수 있습니다. 특정 작업이 다른 작업보다 중요하여 먼저 실행해야 하거나 작업 실행 순서가 중요한 경우에 유용합니다.

`TaskQueue` API는 작업에 대해 "high", "normal" 및 "low"의 세 가지 우선 순위 수준을 제공합니다. 우선순위가 높은 작업은 우선순위가 낮은 작업보다 먼저 실행됩니다. 우선 순위가 같은 작업은 대기열에 추가된 순서대로 실행됩니다.

다음은 `TaskQueue` API를 사용하는 방법의 예입니다.

// create a new task queue with three priority levels

const taskQueue = new TaskQueue(['high', 'normal', 'low']);

// add some tasks to the queue with different priorities

taskQueue.enqueue(() => console.log('Task 1 (normal priority)'));

taskQueue.enqueue(() => console.log('Task 2 (high priority)'), 'high');

taskQueue.enqueue(() => console.log('Task 3 (low priority)'), 'low');

taskQueue.enqueue(() => console.log('Task 4 (normal priority)'));

// start executing tasks in the queue

taskQueue.run();

이 예에서는 "high", "normal" 및 "low"의 세 가지 우선 순위 수준으로 새 `TaskQueue`를 만듭니다. 그런 다음 우선 순위가 다른 4개의 작업을 대기열에 추가합니다. 작업 2는 우선 순위가 높으므로 다른 작업보다 먼저 실행됩니다. 작업 3은 우선 순위가 낮으므로 다른 모든 작업 후에 실행됩니다. 작업 1과 4는 일반적인 우선 순위를 가지며 대기열에 추가된 순서대로 실행됩니다.

마지막으로 `TaskQueue`에서 `run()` 메서드를 호출하여 대기열에서 작업 실행을 시작합니다. 이 예의 출력은 다음과 같습니다.

Task 2 (high priority)

Task 1 (normal priority)

Task 4 (normal priority)

Task 3 (low priority)

보다시피 작업은 우선 순위에 지정된 순서대로 실행되었습니다. 태스크 2는 우선순위가 높기 때문에 먼저 실행되고 태스크 1과 4(일반적인 우선순위는 동일), 마지막으로 태스크 3은 우선순위가 낮습니다.

728x90

'IT' 카테고리의 다른 글

자바스크립트 "Pointer Lock API"  (0) 2023.03.13
자바스크립트 "Presentation API"  (0) 2023.03.13
자바스크립트 "Push API"  (0) 2023.03.13
자바스크립트 "Reporting API"  (0) 2023.03.13
자바스크립트 "Resize Observer API"  (0) 2023.03.13
728x90

Push API는 웹사이트가 열려 있지 않은 경우에도 웹사이트가 서버에서 푸시 알림을 받을 수 있도록 하는 JavaScript API입니다. 푸시 알림은 사용자의 장치로 전송되는 메시지이며 사용자가 웹사이트나 애플리케이션을 적극적으로 사용하지 않는 경우에도 표시될 수 있습니다.

다음은 JavaScript에서 Push API를 사용하는 방법의 예입니다.

// First, check if the browser supports the Push API

if ('PushManager' in window) {

// Request permission to show notifications

Notification.requestPermission().then(permission => {

if (permission === 'granted') {

// Register a service worker to handle push notifications

navigator.serviceWorker.register('service-worker.js').then(() => {

console.log('Service worker registered');

 

// Get a push subscription from the server

return navigator.serviceWorker.ready.then(serviceWorkerRegistration => {

return serviceWorkerRegistration.pushManager.subscribe({

userVisibleOnly: true,

applicationServerKey: urlBase64ToUint8Array('your-public-key')

});

});

}).then(subscription => {

console.log('Push subscription successful');

 

// Send the subscription to the server to store it for later use

fetch('/subscribe', {

method: 'POST',

headers: {

'Content-Type': 'application/json'

},

body: JSON.stringify({

subscription: subscription

})

}).then(() => {

console.log('Subscription sent to server');

}).catch(error => {

console.error('Error sending subscription to server:', error);

});

}).catch(error => {

console.error('Error registering service worker:', error);

});

} else {

console.error('Permission to show notifications denied');

}

});

} else {

console.error('Push notifications not supported');

}

// Convert a base64-encoded string to a Uint8Array

function urlBase64ToUint8Array(base64String) {

const padding = '='.repeat((4 - base64String.length % 4) % 4);

const base64 = (base64String + padding)

.replace(/\-/g, '+')

.replace(/_/g, '/');

const rawData = window.atob(base64);

const outputArray = new Uint8Array(rawData.length);

for (let i = 0; i < rawData.length; ++i) {

outputArray[i] = rawData.charCodeAt(i);

}

return outputArray;

}

이 코드는 다음을 수행합니다.

  1. 브라우저가 Push API를 지원하는지 확인합니다.
  2. 알림을 표시하려면 사용자에게 권한을 요청합니다.
  3. 푸시 알림을 처리할 서비스 워커를 등록합니다.
  4. 서버에서 푸시 구독을 가져옵니다.
  5. 나중에 사용할 수 있도록 저장하기 위해 구독을 서버로 보냅니다.

`urlBase64ToUint8Array` 함수는 base64로 인코딩된 문자열을 `pushManager.subscribe` 메서드의 `applicationServerKey` 속성에 필요한 Uint8Array로 변환하는 데 사용됩니다.

구독이 서버에 저장되면 서버는 올바른 장치를 대상으로 하는 구독을 사용하여 사용자의 장치에 푸시 알림을 보낼 수 있습니다.

728x90
728x90

JavaScript Reporting API는 웹 애플리케이션이 오류 및 진단 정보를 서버에 보고할 수 있도록 하는 비교적 새로운 API입니다. 그런 다음 이 정보를 사용하여 애플리케이션의 성능과 안정성을 모니터링하고 분석할 수 있습니다.

Reporting API는 Report-To 헤더와 ReportingObserver 인터페이스의 두 가지 주요 구성 요소로 구성됩니다. Report-To 헤더는 보고서를 보낼 위치를 지정하는 데 사용되고 ReportingObserver 인터페이스는 보고서를 관찰하는 데 사용됩니다.

다음은 Reporting API를 사용하여 오류를 보고하는 방법의 예입니다.

// Set up the Report-To header

const reportTo = {

group: "my-group",

max_age: 86400,

endpoints: [

{

url: "https://example.com/report",

priority: 1,

},

],

};

navigator.report({

type: "crash",

url: "https://example.com/error",

status: 500,

message: "Something went wrong",

stack: "at function1 (example.js:1:1)\n at function2 (example.js:2:2)",

});

// Set up the ReportingObserver

const observer = new ReportingObserver((reports) => {

for (const report of reports) {

console.log(report);

}

}, { types: ['crash'] });

// Start observing reports

observer.observe();

이 예에서는 보고서를 `https://example.com/report`로 보내도록 지정하는 Report-To 헤더를 설정합니다. 그런 다음 `navigator.report()` 메서드를 사용하여 `crash`, URL `https://example.com/error`, 상태 코드 `500`, `"Something went wrong"`라는 메시지와 함께 오류 및 스택 추적 `"at function1 (example.js:1:1)\n at function2 (example.js:2:2)"`를 보고합니다.

또한 `crash` 유형의 보고서를 관찰하도록 `ReportingObserver`를 설정했습니다. 관찰자는 보고를 받으면 보고서를 콘솔에 기록합니다.

`navigator.report()` 메서드는 현재 Chromium 기반 브라우저에서만 지원되며 `ReportingObserver` 인터페이스는 현재 Firefox에서만 지원됩니다. 또한 보고서를 수신하는 서버는 Reporting API 형식을 지원해야 합니다.

 
728x90
728x90

Resize Observer API는 개발자가 요소 콘텐츠 크기 또는 테두리 상자 크기의 변경 사항을 추적할 수 있는 최신 웹 브라우저의 비교적 새로운 API입니다. 이 API는 응답형 웹 디자인에 특히 유용합니다. 개발자가 폴링이나 비용이 많이 드는 레이아웃 계산과 같은 비효율적이고 해키한 솔루션에 의존하지 않고도 페이지 요소의 크기 변경에 응답할 수 있기 때문입니다.

다음은 Resize Observer API를 사용하여 요소 크기의 변경 사항을 추적하는 간단한 예입니다.

<div id="element-to-watch">

<!-- content -->

</div>

<script>

const elementToWatch = document.getElementById('element-to-watch');

const observer = new ResizeObserver(entries => {

for (let entry of entries) {

console.log(`Element resized to ${entry.contentRect.width}px wide`);

}

});

observer.observe(elementToWatch);

</script>

이 예제에서는 먼저 `id`가 `element-to-watch`인 `div` 요소를 만듭니다. 그런 다음 새 `ResizeObserver` 개체를 만들고 관찰된 요소의 크기가 변경될 때마다 호출되는 콜백 함수를 전달합니다. 이 콜백 함수는 요소의 새 너비를 콘솔에 기록합니다.

마지막으로 관찰자 개체에서 `observe` 메서드를 호출하여 `elementToWatch` 요소를 전달합니다. 이는 관찰자에게 요소의 크기 변화를 관찰하기 시작하도록 지시합니다.

사용자가 브라우저 창의 크기를 조정하거나 `element-to-watch` 요소의 크기를 변경하면 요소의 새 크기에 대한 정보가 포함된 `ResizeObserverEntry` 개체의 배열과 함께 콜백 함수가 호출됩니다. 이 예에서는 새 너비를 콘솔에 기록하지만 실제 애플리케이션에서는 이 정보를 사용하여 페이지 레이아웃을 업데이트하거나 다른 요소의 크기를 조정하거나 요소의 새 크기에 기반으로 다른 작업을 트리거할 수 있습니다.

ResizeObserver API는 브라우저 창 크기 또는 페이지 콘텐츠의 변화에 적응할 수 있는 반응형 동적 웹 애플리케이션을 구축하기 위한 강력한 도구입니다. 그러나 새로운 기술과 마찬가지로 코드를 철저하게 테스트하고 이전 브라우저와의 잠재적인 성능 또는 호환성 문제를 인식하는 것이 중요합니다.

728x90

'IT' 카테고리의 다른 글

자바스크립트 "Push API"  (0) 2023.03.13
자바스크립트 "Reporting API"  (0) 2023.03.13
자바스크립트 "Screen Capture API"  (0) 2023.03.13
자바스크립트 "Screen Orientation API"  (0) 2023.03.13
자바스크립트 "Selection API"  (0) 2023.03.13
728x90

Screen Capture API는 웹 개발자가 사용자의 화면 또는 장치 카메라에서 비디오, 오디오 및 이미지를 캡처할 수 있도록 하는 JavaScript API입니다. 이 API를 사용하면 장치 화면 또는 카메라와의 사용자 상호 작용을 실시간으로 캡처하고 기록할 수 있는 애플리케이션을 만들 수 있습니다.

Screen Capture API를 사용하려면 사용자에게 화면이나 카메라에 액세스할 수 있는 권한을 요청해야 합니다. 다음은 이를 수행할 수 있는 방법의 예입니다.

navigator.mediaDevices.getDisplayMedia({ video: true })

.then(stream => {

// Do something with the stream, like display it in a video element

})

.catch(error => {

// Handle the error

});

이 예제에서는 `navigator.mediaDevices` 개체의 `getDisplayMedia` 메서드를 사용하여 사용자 화면 캡처 권한을 요청합니다. 이 메서드는 캡처된 화면을 포함하는 `MediaStream` 개체로 해결되는 `Promise`를 반환합니다.

다음은 사용자의 카메라에서 비디오를 캡처하는 방법을 보여주는 또 다른 예입니다.

navigator.mediaDevices.getUserMedia({ video: true })

.then(stream => {

// Do something with the stream, like display it in a video element

})

.catch(error => {

// Handle the error

});

이 예제에서는 `navigator.mediaDevices` 개체의 `getUserMedia` 메서드를 사용하여 사용자의 카메라에 액세스할 수 있는 권한을 요청합니다. 이 메서드는 캡처된 비디오를 포함하는 `MediaStream` 개체로 확인되는 `Promise`를 반환합니다.

`MediaStream` 개체가 있으면 이를 사용하여 캡처된 비디오를 `video` 요소에 표시하거나 `MediaRecorder` API를 사용하여 녹화하는 등의 작업을 수행할 수 있습니다.

다음은 `video` 요소에 캡처된 비디오를 표시하는 방법의 예입니다.

const videoElement = document.querySelector('video');

navigator.mediaDevices.getUserMedia({ video: true })

.then(stream => {

videoElement.srcObject = stream;

})

.catch(error => {

// Handle the error

});

이 예제에서는 비디오 요소의 `srcObject` 속성을 사용하여 해당 소스를 `getUserMedia`에서 반환된 `MediaStream` 개체로 설정합니다. `video` 요소에 캡처된 비디오가 표시됩니다.

다음은 `MediaRecorder` API를 사용하여 캡처된 비디오를 녹화하는 방법의 예입니다.

navigator.mediaDevices.getUserMedia({ video: true })

.then(stream => {

const mediaRecorder = new MediaRecorder(stream);

mediaRecorder.start();

setTimeout(() => {

mediaRecorder.stop();

}, 5000);

mediaRecorder.addEventListener('dataavailable', event => {

const videoBlob = new Blob([event.data], { type: 'video/webm' });

// Do something with the recorded video blob, like upload it to a server

});

})

.catch(error => {

// Handle the error

});

이 예제에서는 `MediaRecorder` API를 사용하여 캡처된 비디오를 5초 동안 녹화합니다. `getUserMedia`에 의해 반환된 `MediaStream` 개체로 `MediaRecorder` 개체를 만들고, `start` 메서드를 호출하여 녹음을 시작하고, `stop` 메서드를 호출하여 5초 후에 녹음을 중지합니다. 또한 녹화된 비디오 데이터를 서버에 업로드하거나 디스크에 저장할 수 있는 `Blob` 개체로 캡처하기 위해 `MediaRecorder` 개체의 `dataavailable` 이벤트에 이벤트 리스너를 추가합니다.

728x90

'IT' 카테고리의 다른 글

자바스크립트 "Reporting API"  (0) 2023.03.13
자바스크립트 "Resize Observer API"  (0) 2023.03.13
자바스크립트 "Screen Orientation API"  (0) 2023.03.13
자바스크립트 "Selection API"  (0) 2023.03.13
자바스크립트 "Sensor API"  (0) 2023.03.13
728x90

Screen Orientation API는 장치 화면 방향에 대한 정보를 제공하고 개발자가 프로그래밍 방식으로 화면 방향을 제어할 수 있도록 하는 JavaScript API입니다. API는 두 가지 주요 속성에 대한 액세스를 제공합니다.

1. `screen.orientation.type`: 이 속성은 화면의 현재 방향을 반환합니다. 가능한 값은 "portrait-primary", "portrait-secondary", "landscape-primary" 및 "landscape-secondary"입니다.

2. `screen.orientation.angle`: 이 속성은 화면이 현재 향하고 있는 각도를 도 단위로 반환합니다.

다음은 Screen Orientation API를 사용하여 기기 화면의 현재 방향을 감지하는 방법의 예입니다.

if (screen.orientation.type.startsWith("portrait")) {

console.log("The device is in portrait mode.");

} else {

console.log("The device is in landscape mode.");

}

다음은 API를 사용하여 화면 방향을 특정 모드로 잠그는 방법의 예입니다.

screen.orientation.lock("landscape-primary").then(function() {

console.log("Screen orientation locked to landscape-primary.");

}).catch(function() {

console.error("Failed to lock screen orientation.");

});

화면 방향 잠금은 터치 또는 클릭 이벤트와 같은 사용자 상호 작용에 대한 응답으로만 수행할 수 있습니다. 이는 웹사이트가 이용자의 동의 없이 화면의 방향을 임의로 변경하는 것을 방지하기 위함입니다.

728x90

'IT' 카테고리의 다른 글

자바스크립트 "Resize Observer API"  (0) 2023.03.13
자바스크립트 "Screen Capture API"  (0) 2023.03.13
자바스크립트 "Selection API"  (0) 2023.03.13
자바스크립트 "Sensor API"  (0) 2023.03.13
자바스크립트 "Server Sent Events API"  (0) 2023.03.13

+ Recent posts