HTML5λ μ 보λ₯Ό λ§ν¬ν΄μ 보μ¬μ£ΌκΈ° μν νκ·Έ λ¬Έλ² μ΄μΈμ μλ°μ€ν¬λ¦½νΈλ‘ λμνλ APIλ€μ ν¬ν¨νμ¬ μΉ μ체μ κΈ°λ₯μ νμ₯νμλ€. μΆκ°λ APIλ€μ μ΄ν΄λ³΄λ©΄ λ§μΉ μΉμ λͺ¨λ°μΌ μ±μ²λΌ λ§λ€κ³ μ νλ κ²μΌλ‘ 보μΈλ€.
HTML5 APIλ λ€μκ³Ό κ°λ€.
- Video, Audio
- Canvas
- Form
- Drag & Drop
- Geo Location
- Web Storage
- IndexedDB
- File
- Communication
- Web Worker
νμ¬ HTML5 κ²μμ λ§λλ λ° νμ©νκ³ μλ Phaser μμ§μ λ΄λΆμ λ‘ Audioμ Canvas κΈ°λ₯μ μ¬μ©νκ³ μλ€.
μΉ νμ΄μ§μμ λΉλμ€λ₯Ό μ¬μνλ κΈ°λ₯
<video src="../video/big_buck_bunny.webm"
width="640" height="360"
controls="controls"
loop="loop"
autoplay="autoplay"
poster="../images/virus.png"
preload="auto">
λΉμ μ λΈλΌμ°μ λ HTML5μ video νκ·Έλ₯Ό μ§μνμ§ μμ΅λλ€.
</video>
νμ¬ HTML5μ video νκ·Έλ νμ€νλ μ½λ±μ΄ μλ€. MP4λ λͺ¨λ λΈλΌμ°μ μμ μ§μλκ³ WebMκ³Ό Oggλ μ¬ν리, IEμμλ μ§μλμ§ μλλ€. μ½λ± λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ video νκ·Έ μμ λ€λ₯Έ μ½λ±μ μ¬μ©ν΄μ μΈμ½λ©ν srcλ₯Ό μΆκ°νλ©΄ λλ€. κ·Έλ¬λ©΄ μλμΌλ‘ λΈλΌμ°μ μμ μ¬μν μ μλ srcλ₯Ό μ νν΄μ μ¬μνλ€.
video νκ·Έλ HTMLMediaElement APIλ₯Ό μ¬μ©ν΄μ 컨νΈλ‘€ν μ μλ€. μ΄ APIλ₯Ό ν΅ν΄ λΉλμ€ μ¬μμ 컨νΈλ‘€ νκ±°λ, λΉλμ€ νλ μ΄μ΄μ UIλ₯Ό μ§μ λ§λ€ μλ μλ€.
μμ μΉ κ²μμ κ²½μ° μ€νλμ΄λ μλ© μμμ Youtubeλ₯Ό μ΄μ©ν΄ μ¬μμν€λ κ²½μ°κ° μ’ μ’ μμλ€. λ€μ΄λ Έλ³Όμ¦μμλ μ νλΈλ₯Ό μ΄μ©ν μμ μ½μ μ μλνμμ§λ§ Facebookμ μ μ± μΌλ‘ μ€ν¨νλ€. (iframe μ¬μ© λΆκ°) λ§μ½ video νκ·Έλ₯Ό μ¬μ©ν΄ μμμ μ¬μνκ³ video APIλ‘ μ»¨νΈλ‘€λ€μ 보μ΄μ§ μκ² μ»€μ€ν°λ§μ΄μ§ νλ€λ©΄ λμμμΌλ‘ μΈκ²μ μ°μΆμ ν μλ μμ κ²μ΄λ€.
μμμμλ μλ²μμ νμΌμ μ λΆ λ‘λν ν μ¬μνλ κΈ°λ₯λ§μ μκ°νκ³ μμ§λ§, MediaSource API λ₯Ό μ¬μ©ν κ²½μ° λΉλμ€ μ€νΈλ¦¬λ°λ ν μ μλ€.
μΉ λ¬Έμ μμ Elementλ₯Ό Drag & Drop ν μ μλλ‘ μ§μ λ‘컬 μ»΄ν¨ν°μ νμΌμ λΈλΌμ°μ λ‘ λλκ·Έ & λλ‘ νμ λ μ¬μ©λλ API μ΄λ€.
HTML νκ·Έμμ draggable μμ±μ trueλ‘ μ€μ νλ©΄ ν΄λΉ μμλ λλκ·Έν μ μκ² λλ€.
μ΄ν ν΄λΉ μμμ dragstart
, drag
, dragenter
, dragover
, dragleave
, drop
, dragend
μ κ°μ μ΄λ²€νΈλ₯Ό λ±λ‘νμ¬ λλκ·Έ μ΄λ²€νΈμ λ°λ₯Έ λμμ μ€μ νλ€.
μ΄λ DataTransfer
κ°μ²΄κ° λλκ·Έ μ΄λ²€νΈλ₯Ό ν΅ν΄ μ νλλλ° μ΄ κ°μ²΄λ λλκ·Έ μμ€μμ λλ‘ λͺ©μ μ§λ‘ μ λ¬λ λ°μ΄ν°λ₯Ό 보κ΄νλ μν μ νλ€.
νκ·Έ μ€μ
<img src="../images/beer.png" draggable="true">
μ΄λ²€νΈ λ±λ‘ λ° API μ¬μ©
var item = document.querySelector(".menuItem");
var target = document.querySelector(".dropTarget");
item.addEventListener("dragstart", function(e) {
e.dataTransfer.setData("text/plain", e.target.dataset.type);
e.dataTransfer.setData("id", e.target.id);
});
target.addEventListener("drop", function(e) {
var id = e.dataTransfer.getData("id");
var type = e.dataTransfer.getData("text/plain");
this.appendChild(document.querySelector("#" + id));
});
Canvas λ΄λΆμ μΌλ‘ Drag μ΄λ²€νΈλ₯Ό μ²λ¦¬ν μ μμΌλ―λ‘ κ²μ μ μ μμλ μμ£Ό μ¬μ©νμ§ μμ κ² κ°λ€.
λ€λ§ μΈκ²μκ³Ό Canvas μΈλΆ μμ μ¬μ΄μ λλκ·Έ μ΄λ²€νΈκ° νμνλ€κ±°λ μΈκ²μμ μ»΄ν¨ν° νμΌμ λλκ·Έ νλ€κ±°λ νλ μΌλ μμ μ μμΌλ―λ‘ μμλλ κ²μ΄ μ’μ κ² κ°λ€.
μΉμμ μ¬μ©μμ νμ¬ μμΉλ₯Ό μλ/κ²½λ μ λ³΄λ‘ νμΈν μ μλ APIμ΄λ€.
μμΉ μ 보 νλ λ°©λ²μ μλ 3κ°μ§κ° μλ€. HTML5 APIμμλ μλ λ°©λ²λ€μ μ‘°ν©ν΄μ μ¬μ©νλ€.
- IP μ£Όμ κΈ°λ° : μ»΄ν¨ν° κΈ°κΈ°μ IPλ₯Ό λΆμ¬νλ ISPμμ μ 보λ₯Ό λ겨λ°μ νμΈ. μ ννλ ISPμ μμΉκ° μ‘νλ€.
- GPS κΈ°λ° : GPS λ¨λ§μ΄ μμ΄μΌλ§ μ¬μ©ν μ μλ€. μμ±μΌλ‘λΆν° μ 보λ₯Ό λ°κΈ° λλ¬Έμ μκ°μ΄ μ€λ κ±Έλ¦¬κ³ λ°°ν°λ¦¬ μλͺ¨κ° ν¬λ€.
- μ΄λ ν΅μ κΈ°λ° : μ΄λ ν΅μ κΈ°μ§κ΅μ νμ©
- Wi-Fi κΈ°λ° : Wi-Fi μ‘μμ μ μν APλ₯Ό μ΄μ©ν΄ μμΉλ₯Ό νμΈ
κΈ°κΈ° νκ²½κ³Ό μ μ μ μ€μ μ λ°λΌ μ νλκ° λ¨μ΄μ§ μ μμΌλ©°, GPS μ¬μ©μ μν΄μλ λ³λλ‘ μ μ λμκ° νμν μ μλ€.
μ§μ€λ‘μΌμ΄μ APIμ μ¬μ©λ²μ μΌνμ± μμΉ μ 보 μμ²κ³Ό λ°λ³΅μ μΈ μμΉ μ λ°μ΄νΈ λ κ°μ§κ° μλ€.
var geolocation = navigator.geolocation;
var options = {
enableHighAccuracy: false,
timeout: 30000,
maximumAge: 0
};
geolocation.getCurrentPosition(success, error, options);
function success(position) {
var coords = position.coords;
var date = new Date(position.timestamp);
var latitude = coords.latitude;
var longitude = coords.longitude;
var accuracy = coords.accuracy;
}
function error(positionError) {
switch (positionError) {
case 1:
console.log("μ¬μ©μκ° κΆν λΆμ¬λ₯Ό κ±°λΆνμμ΅λλ€.");
break;
case 2:
console.log("λ΄λΆ μ€λ₯λ‘ μμΉ μ 보λ₯Ό κ°μ Έμ€μ§ λͺ»νμ΅λλ€.");
break;
case 3:
console.log("Timeout μ΄κ³Όλ‘ μ 보λ₯Ό κ°μ Έμ€μ§ λͺ»νμ΅λλ€.");
break;
}
}
νλ² μμ²νλ©΄ μ§μμ μΌλ‘ μμΉ μ 보λ₯Ό μ
λ°μ΄νΈνλ κΈ°λ₯μΌλ‘ watchPosition()
ν¨μλ₯Ό μ¬μ©νλ€.
ν¨μμ μ€νκ²°κ³Όλ‘ id
λ₯Ό λ°ννλλ°, μ΄ idλ₯Ό clearWatch()
ν¨μμ νλΌλ―Έν°λ‘ μ λ¬νμ¬ μμΉ μ 보 μ
λ°μ΄νΈλ₯Ό μ€μ§νλ€.
λλ°μ΄μ€μ μμΉκ° λ³κ²½λ λλ§λ€ success
μ½λ°±μ λμμν¨λ€.
var geolocation = navigator.geolocation;
var options = {
enableHighAccuracy: false,
timeout: 30000,
maximumAge: 0
};
var watchId = geolocation.watchPosition(success, error, options);
function success(position) {
var coords = position.coords;
var date = new Date(position.timestamp);
var latitude = coords.latitude;
var longitude = coords.longitude;
var accuracy = coords.accuracy;
}
function error(positionError) {
switch (positionError) {
case 1:
console.log("μ¬μ©μκ° κΆν λΆμ¬λ₯Ό κ±°λΆνμμ΅λλ€.");
break;
case 2:
console.log("λ΄λΆ μ€λ₯λ‘ μμΉ μ 보λ₯Ό κ°μ Έμ€μ§ λͺ»νμ΅λλ€.");
break;
case 3:
console.log("Timeout μ΄κ³Όλ‘ μ 보λ₯Ό κ°μ Έμ€μ§ λͺ»νμ΅λλ€.");
break;
}
}
function stopWatching() {
geolocation.clearWatch(watchId);
}
HTML5 κ²μμ κ°μ μ€ νλλ λ°λ‘ λ€μν νλ«νΌκ³Ό κΈ°κΈ°μμ λμΌν κ²½νμ κ°κ² νλ κ²μ μλ€.
κ·Έλ¬λ GeoLocation APIλ₯Ό μλ‘ λ€λ₯Έ κΈ°κΈ°μμ λμΌν κ²°κ³Όλ₯Ό 보μ₯νμ§ μλλ€.
λΉμ₯ λ°μ€ν¬νμμλ ISPμ μ λ³΄κ° λνλ λΏμ΄λ€.
λ§μ½ ν¬μΌλͺ¬ GO μ²λΌ GPSκ° μμ΄μΌλ§ μ€νν μ μλ€λ©΄ νμ©ν μ μλ μ¬μ§κ° μκ² μ§λ§
μ΄λ·°μ§μ μ·¨μ½ν HTML5 νκ²½μ νΉμ± μ, μμΉ μ 보λ₯Ό ν€ ν¬μΈνΈμΌλ‘ νμ©νκΈ°λ νλ€ κ²μΌλ‘ 보μΈλ€.
μΉ μ€ν 리μ§λ μΏ ν€λ₯Ό κ°μ ν κΈ°μ μ΄λ€.
λλ©μΈ λ³λ‘ μ μ₯λλ―λ‘ μλ‘ λ€λ₯Έ λλ©μΈμ μ€ν 리μ§λ₯Ό μ§μ μ°Έμ‘°ν μ μλ€.
μλ‘ λ€λ₯Έ νμ΄μ§λΌκ³ ν΄λ λμΌ λλ©μΈμ΄λΌλ©΄ λμΌ μ μ₯μλ₯Ό μ°Έμ‘°νλ€. λ°λΌμ λλ©μΈ λ΄μ μ¬λ¬ νμ΄μ§κ° μκ³ νμ΄μ§ λ³λ‘ λ€λ₯Έ κ°μ μ μ₯νκ³ μ νλ€λ©΄ ν€λ₯Ό κΈΈκ² νμ.
- λ€νΈμν¬ λΆν μ λ°
- μλ² μμ² μ, ν΄λΌμ΄μΈνΈμ μΏ ν€κ° ν¨κ» μ μ‘λλ€.
- 보μμμ λ¬Έμ
- μΏ ν€λ μ μ‘ κ³Όμ μμ μ½κ² νμ·¨ λ° μ‘°μλ μ μλ€.
- μΏ ν€μ μ°¨λ¨
- μμ λ¬Έμ λ‘ μΈν΄ λλΆλΆμ λΈλΌμ°μ μμ μΏ ν€λ₯Ό μ°¨λ¨νκ³ μλ€.
- μ νμ μΈ μ©λ
- μΏ ν€μ μ©λμ κΈ°κ»ν΄μΌ 4kb μ λμ΄λ€.
- μ΄λ¦κ³Ό κ°μ λ¨μν ννλ‘ λ°μ΄ν°λ₯Ό μ μ₯νλ€.
- ν΄λΌμ΄μΈνΈμ 곡κ°μ λ°μ΄ν°λ₯Ό μ μ₯νλ€.
- μΉ μ€ν λ¦¬μ§ λ°μ΄ν°λ μλ²λ‘ μ μ‘λμ§ μλλ€.
- νκ· μ μΌλ‘ 5Mb μ΄μμ μ©λμ μ 곡νλ€.
- μΈμ
μ€ν 리μ§
- λΈλΌμ°μ μ μΈμ κΈ°κ°λ§ λ°μ΄ν°λ₯Ό μ μ§
- λμΌν λΈλΌμ°μ (ν)μμ 리νλ μ ν΄λ λ°μ΄ν° μ μ§
location.href
λ‘ λ¦¬λ€μ΄λ νΈ ν, λ€λ‘κ°κΈ°λ‘ λμκ°λ λ°μ΄ν° μ μ§- λ€λ₯Έ λΈλΌμ°μ (ν)μ μ΄μ΄ κ²μμ μ€νν κ²½μ° λ°μ΄ν° μ μ€
- λ‘컬 μ€ν 리μ§
- λ‘컬 μ€ν 리μ§λ λΈλΌμ°μ λ₯Ό λ«μλ λ°μ΄ν°λ₯Ό μμ νμ§ μλλ€.
- νμΌλ‘ μ μ₯λλ©° ν¬λ‘¬μ κ²½μ°
/Local Settings/Application Data/Google/Chrome/UserData/Default/Local Storage
μ μ μ₯
- μλ‘ λ€λ₯Έ λΈλΌμ°μ λ λ‘컬 μ€ν λ¦¬μ§ μ μ₯ νμΌμ΄ λ€λ₯΄κΈ° λλ¬Έμ 곡μ ν μ μλ€.
- λμΌν λΈλΌμ°μ μ¬λ¬ κ°μμ λμΌν λλ©μΈμ μ μν κ²½μ°, λ‘컬 μ€ν 리μ§λ₯Ό 곡μ ν΄μ μ¬μ©ν μ μλ€.
- λ‘컬 μ€ν 리μ§κ° λ³κ²½λ κ²½μ° windowμ storage μ΄λ²€νΈκ° λ°μ
κΈ°λ³Έμ μΈ μ¬μ©λ²μ λ€μκ³Ό κ°λ€.
try {
if (window.localStorage) {
localStorage.setItem("test", "test-value");
localStorage.getItem("test");
localStorage.removeItem("test");
}
if (window.sessionStorage) {
sessionStorage.setItem("test2", "test-value");
sessionStorage.getItem("test2");
sessionStorage.removeItem("test2");
}
} catch (exception) {
// μ©λ μ΄κ³Ό μ, QuotaExceededError λ°μ
return exception;
} finally {
localStorage.clear();
sessionStorage.clear();
}
λ‘컬 μ€ν λ¦¬μ§ κ³΅μ
window.addEventListener("storage", function(e) {
console.log(e.key);
});
λ€μ΄λ Έλ³Όμ¦μμλ 곡μ§μ¬ν νμΈ μ¬λΆλ₯Ό λ‘컬 μ€ν 리μ§μ μ μ₯νκ³ μλ€. λ§ν¬
λν Facebook Instant SDKμμλ μ μ μ μ΄λ¦κ³Ό νλ‘ν μ΄λ―Έμ§ URLμ λ‘컬 μ€ν 리μ§μ μ μ₯νλ κ²μ κΆμ₯νκ³ μλ€.
ν΄λΌμ΄μΈνΈ λΈλΌμ°μ μ ꡬ쑰μ λ°μ΄ν°λ₯Ό μ μ₯ν μ μμ΄μ μ€νλΌμΈμμλ μμ ν μ μλ€.
MDN μΉ λνλ¨ΌνΈλ₯Ό 보면 λΈλΌμ°μ λ° μ€μ μ λ°λΌ DB μ©λ μ νμ΄ λ€λ₯Ό μ μλ€.
- νμ΄μ΄νμ€λ 50MB μ΄μμ μ©λμ΄ νμν κ²½μ° κΆν μΉμΈ μμ² μΈν°νμ΄μ€κ° λ ΈμΆλλ€.
- ν¬λ‘¬μ λΈλΌμ°μ μ¬μ© κ°λ₯ μ©λμ λ°λΌ λ€λ₯΄λ€.
ν€-κ° μμΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νλ©°, μ΄ ν€λ€μ μ΄μ©ν΄ μΈλ±μ€λ₯Ό λ§λ€ μ μκ³ μ΄λ₯Ό κ°μ²΄ μ‘°νμ νμ©νλ€.
νΈλμμ λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈ κΈ°λ°μΌλ‘ λμνλ€. μΈλ±μ€, ν μ΄λΈ, 컀μ λ±μ μμ μ λͺ¨λ νΈλμμ λ΄μμ μνλμ΄μΌ νλ€. indexedDBλ μλ 컀λ°μΌλ‘ λμνλ©° μλ 컀λ°μ μ§μνμ§ μλλ€.
λΉλκΈ° λ°©μμΌλ‘ λμνλ©° λμμ΄ μλ£λ λ μ½λ°± μ΄λ²€νΈλ₯Ό λ°μ μ²λ¦¬ν΄μΌ νλ€. λ°λΌμ λκΈ°μ μΌλ‘ κ΄λ ¨ μμ μ μ²λ¦¬νκ³ μΆλ€λ©΄ Promiseλ₯Ό μ΄μ©ν΄ λνν΄μΌ νλ€.
SQLμ μ¬μ©νμ§ μκ³ ν¨μ κΈ°λ°μΌλ‘ λ°μ΄ν° μ μ₯, μμ , κ²μ, μμ λ₯Ό μννλ€.
νΉν κ²μμ μν΄μ μΈλ±μ€λ₯Ό ν΅ν΄ μμ±ν 컀μλ₯Ό μ¬μ©ν΄μΌ νλ€.
λμΌ κ·Όμ μ μ± μ λ°λ₯΄λ―λ‘ νλ‘ν μ½, λλ©μΈ, ν¬νΈκ° κ°μ κ²½μ° indexedDB λ₯Ό 곡μ νκ³ λ€λ₯Ό λλ 곡μ νμ§ μλλ€.
KeyRange API
λ₯Ό μ¬μ©ν΄μ μΈλ±μ€ κ°μ λν΄ λ²μ κ²μμΌλ‘ λ°μ΄ν°λ₯Ό μΆμΆν μ μλ€.
DBλ₯Ό μ¬λ μ¬μ© μ (λ€μ΄λ Έλ³Όμ¦)
this.openStaticDB = function() {
var promise = new Promise(function(resolve, reject) {
if (!window.indexDB) {
StaticManager.dbConnect = null;
reject("indexedDB not allowed.");
}
var staticDB = indexedDB.open("dino_static");
staticDB.addEventListener("upgradeneeded", function() {
StaticManager.dbConnect = staticDB.result;
if (StaticManager.dbConnect.objectStoreNames.contains("dino_static") === false) {
StaticManager.dbConnect.createObjetStore("dino_static", {keyPath: "name"});
}
});
staticDB.addEventListener("success", function() {
StaticManager.dbConnect = staticDB.result;
resolve(StaticManager.dbConnect);
});
staticDB.addEventListener("error", function(err) {
StaticManager.dbConnect = null;
reject(JSON.stringify(err));
});
});
return promise;
};
DBμμ λ°μ΄ν° μ‘°ν μ (λ€μ΄λ Έλ³Όμ¦)
this.getIndexedData = function() {
var promise = new Promise(function(resolve, reject) {
if (!window.indexedDB || !StaticManager.dbConnect) {
StaticManager.dbConnect = null;
reject("indexedDB not allowed.");
}
var tx = StaticManager.dbConnect.transaction(["dino_static"], "readonly");
var objectStore = tx.objectStore("dino_static");
var request = objectStorage.getAll();
request.addEventListener("success", function() {
var result = {};
for (var i = 0; i < request.result.length; i++) {
this[request.result[i].name] = new StaticModel(request.result[i].name, request.result[i].version, JSON.parse(request.result[i].data))
}
resolve();
});
request.addEventListener("error", function() {
reject("Transaction Error.");
});
});
return promise;
};
DB λ°μ΄ν° μμ (λ€μ΄λ Έλ³Όμ¦)
this.updateIndexedData = function(inName, inVersion, inData) {
var promise = new Promise(function(resolve, reject) {
if (!window.indexedDB || !StaticManager.dbConnect) {
StaticManager.dbConnect = null;
reject("indexedDB not allowed.");
}
var data = {
name: inName,
version: inVersion,
data: JSON.stringify(inData)
};
var tx = StaticManager.dbConnect.transaction(["dino_static"], "readwrite");
var objectStore = tx.objectStore("dino_static");
var request = objectStore.put(data);
request.addEventListener("success", function() {
resolve(data);
});
request.addEventListener("error", function() {
reject("db update failed: " + data.name);
});
});
return promise;
};
μΉ μ€ν 리μ§μ λ¬λ¦¬ μ©λ μ νμμ μμ λ‘κΈ° λλ¬Έμ μ€νν± λ°μ΄ν°λ₯Ό μΊμ±νλ λ° νμ©ν μ μλ€.
νμ¬ λ€μ΄λ Έλ³Όμ¦μ μ μ© μμ μ΄λ€.
File APIλ₯Ό ν΅ν΄ νμΌμ μ½κ±°λ μΈ μ μλ€.
μ°κΈ° κ΄λ ¨ APIλ ν¬λ‘¬κ³Ό μ€νλΌ κ³μ΄μμλ§ μ¬μ©κ°λ₯νλ€.
μ½κΈ° κ΄λ ¨ APIλ μ½κΈ° μ μ©μΌλ‘ νμΌμ μ κ·ΌνκΈ° λλ¬Έμ νμΌμ μμ , μμ λ λΆκ°λ₯νλ€.
νμΌμ μ 보λ₯Ό νμΈνκΈ° μν΄μλ FileReader κ°μ²΄λ₯Ό μ¬μ©νλ€.
FileReader κ°μ²΄λ λΉλκΈ°μ μΌλ‘ λμνλ©° μ¬μ©μμ νμΌμ μ½λ μν μ νλ€.
FileReader κ°μ²΄μ loadstart
, progress
, loadend
μ κ°μ μ΄λ²€νΈλ₯Ό μ¬μ©ν΄μ νμΌ μ½κΈ° μ§νμν©μ νμΈν μ μλ€.
File API μ€μλ Blob APIκ° μλλ°, Blobλ₯Ό ν΅ν΄ λμ©λμ μμ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μλ€.
Blob API μ€ slice ν¨μλ₯Ό μ¬μ©ν΄μ νμΌ μ 체 μ€ μΌλΆλ§ λ©λͺ¨λ¦¬μ λ‘λν΄μ μ¬μ©ν μ μλ€.
FileReader μ¬μ©λ²
var file = inFile;
var fReader = new FileReader();
if (getType(file.type) === "image") {
// μ΄λ―Έμ§ νμΌ μ½κΈ°
fReader.readAsDataURL(file);
} else if (getType(file.type) === "text") {
// λ¬Έμμ΄ νμΌ μ½κΈ°
fReader.readAsText(file);
// νΉμ Blobλ₯Ό μ΄μ©ν΄ νμΌμ μΌλΆλ§ λΆλ¬μ€κΈ°
var blob = file.slice(0, 100);
fReader.readAsText(blob);
}
fReader.addEventListener("load", function(e) {
console.log("νμΌ μ½κΈ° μλ£.");
// νμΌ μ 보λ₯Ό μΈμ
μ€ν 리μ§μ μ μ₯
sessionStorage.setItem(file.name, JSON.strigify(e.result));
});
fReader.addEventListener("error", function(e) {});
fReader.addEventListener("loadstart", function(e) {});
fReader.addEventListener("progress", function(e) {});
fReader.addEventListener("loadend", function(e) {});
λ©λͺ¨λ¦¬ μΊμ 보μμ Blobλ₯Ό νμ©ν μ μμμ§ κ³ λ―Όν΄λ΄€μΌλ, κ·Έλ₯ ArrayBufferλ₯Ό λ°λ‘ μ¬μ©νλκ² λμ λ― νλ€.
κ²λ€κ° Blobλ readonlyμ΄κΈ° λλ¬Έμ κ°μ λ³κ²½μ΄ μμ μ, λ©λͺ¨λ¦¬ λλΉλ§ λ§μμ§ μ μλ€.
μΌλ°μ μΌλ‘ XMLHttpRequest Level2λ₯Ό μ΄μ©νλ Ajax κΈ°μ ,
λ€λ₯Έ κ·Όμμ λ¬Έμ λ©μμ§μ μ§μνλ Cross Document Messaging (λλ Web Messaging),
κ·Έλ¦¬κ³ μλ²μμ μ€μκ° ν΅μ μ μν Web Socketμ μ§μΉνλ€.
νμ¬ λ€μ΄λ Έλ³Όμ¦μμλ jQueryλ₯Ό ν΅ν΄ μ¬μ© μ€μ΄λ€.
Level 2 μμλ μλ²κ° νλ½λ§ νλ€λ©΄ λ€λ₯Έ κ·Όμμμ μ 곡λλ μλΉμ€λ₯Ό λ§μκ» μ¬μ©ν μ μλ€.
μλ²μ μλ΅ ν€λμ Access-Control-Allow-Origin μμ±μΌλ‘ νμ©ν μλ²λ₯Ό λ±λ‘νλ©΄ λλ€.
νμ΄μ€λΆ μΈμ€ν΄νΈ κ²μμ νμ΄μ€λΆ νΈμ€ν μλ²λ₯Ό μ¬μ©νκΈ° λλ¬Έμ κ²μ μλ²μλ κ·Όμμ΄ λ€λ₯΄λ€.
λ°λΌμ κ²μ μλ²μ μλ΅ ν€λμ νμ΄μ€λΆ νΈμ€ν μλ²λ₯Ό λ±λ‘ν΄μ£Όμ΄μΌ νλ€.
ν λ¬Έμμμ λ©μμ§λ₯Ό μμ±ν΄ λ€λ₯Έ νμ΄μ§ (iframe, ν, μλμ°)λ‘ μ μ‘ν μ μλ κΈ°λ₯μ΄λ€.
window.postMessage
ν¨μλ₯Ό μ¬μ©ν΄ λ©μμ§λ₯Ό μ μ‘νκ³ , λ©μμ§λ₯Ό λ°λ μΈ‘μμλ message
μ΄λ²€νΈλ₯Ό ν΅ν΄ μ λ¬λ°μ λ©μμ§λ₯Ό μ²λ¦¬ν μ μλ€.
μΉ μμμ νλμ μμΌμΌλ‘ μλνλ μλ°©ν₯ ν΅μ κΈ°λ₯μ΄λ€.
μμΌ ν΅μ μ κΈ°μ‘΄μ HTTP ν€λλ₯Ό ν΅ν ν΅μ λμ TCP μμΌμ ν΅ν΄ μ΄λ€μ§λ€.
ν€λμ λν μ λ³΄κ° μ€μ΄λ€κΈ° λλ¬Έμ μ μ‘λλ λ°μ΄ν°μ ν¬κΈ°κ° μ€μ΄λ€κ³ , μμΌμ λ«κΈ° μ κΉμ§ μ°κ²°μ΄ μ§μλλ―λ‘ μλ΅ μλλ λΉ λ₯΄λ€.
postMesage μ¬μ©λ²
// iframe μ리먼νΈ
var widget = document.getElementById("widget");
var trust = "http://test.com:8080";
widget.src = trust + "/a.html";
widget.contentWindow.postMessage("test", trust);
window.addEventListener("message", function(e) {
if (e.origin === trust) {
console.log(e.data);
}
});
μΉ μμΌ μ¬μ©λ²
var wsUri = "ws://localhost:8080/echo";
socket = new WebSocket(wsUri);
socket.addEventListener("open", function() {
console.log("μμΌ μ°κ²° μ±κ³΅.");
});
socket.addEventListener("message", function(e) {
console.log("λ©μμ§ μμ : " + e.data);
});
socket.addEventListener("error", function(e) {
console.log("μλ¬ λ°μ: " + JSON.stringify(e));
});
λλΆλΆ κ²μμμλ μλ‘μ΄ νμ΄λ λΈλΌμ°μ λ₯Ό μ¬λ κ²½μ°κ° μλ€.
νμ¬ facebook μμλ iframeλ νμ©νμ§ μκ³ μλ€. νμ§λ§ λ€λ₯Έ νλ«νΌμμλ νμ©ν μ¬μ§κ° μλ€.
μλ° μ€ν¬λ¦½νΈλ κΈ°λ³Έμ μΌλ‘ λ¨μΌ μ€λ λ μΈμ΄μ΄λ€.
κ°λ°νκΈ° νΈλ¦¬νλ€λ μ₯μ μ΄ μμ§λ§, μ°μ°μ΄ κΈΈμ΄μ§ κ²½μ° λ©μΈ μ€λ λμ ν° λΆλ΄μ μ£Όλ©΄μ UI λμ λ±μ μνν μ μκ² λλ€.
μΉ μ컀λ₯Ό ν΅ν΄ μλ°μ€ν¬λ¦½νΈλ₯Ό λ©ν° μ€λ λ ννλ‘ μ¬μ©ν μ μλ€.
μ€ν¬λ¦½νΈμ λμμ λ©μΈ μ€λ λμ λΆλ¦¬λ μμ μ€λ λλ‘ λ§λ€μ΄ μ€λ λκ° λ©μΆκ±°λ λ¦κ² λμνλ κ²μ λ°©μ§ν μ μλ€.
μΉ μ컀μλ μ컀λ₯Ό μμ±ν λ©μΈ μ½λμμλ§ μ¬μ©ν μ μλ μ μ© μ컀(Dedicated Worker)μ μ¬λ¬ λ¬Έμμμμ μμ²μ μλ΅ν μ μλ 곡μ μ컀(Shared Worker)μ λκ°μ§κ° μλ€.
μ컀λ₯Ό μ¬μ©νκΈ° μν΄μλ λ¨Όμ μ컀μμ μ€νν μ½λλ₯Ό λ³λμ μλ°μ€ν¬λ¦½νΈλ‘ λ§λ€μ΄μΌ νλ€.
μ΄ν λ©μΈ μ½λμμ new Worker()
μμ±μλ₯Ό νΈμΆνλ©΄μ νλΌλ―Έν°λ‘ νμΌλͺ
μ λ겨주면 λλ€.
μ컀μ λ©μΈ μ½λλ MessageEvent
κΈ°λ°μΌλ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λλ€.
λν μ컀λ λ©μΈ μ½λμλ λ³κ°μ μ μ 컨ν μ€νΈμμ μ€νλλ―λ‘ μ컀μμ DOMμ μ§μ μ κ·Όν μ μκ³ , μΌλΆ window μμ±λ μ¬μ©ν μ μλ€.
λ©μΈ μ½λμμλ μ컀 λ΄λΆμ μ½λμ μ κ·Όν μ μλ€.
μ컀μμ try catch
λ‘ μ²λ¦¬νμ§ μμ μ€λ₯λ μλμΌλ‘ λ©μΈ μ½λμ μ΄λ²€νΈλ‘ μ λ¬λλ€.
μ΄ μ€λ₯ μ΄λ²€νΈλ₯Ό μ²λ¦¬νκΈ° μν΄ λ©μΈ μ½λμμλ μ컀 κ°μ²΄μ error
μ΄λ²€νΈ 리μ€λλ₯Ό λ±λ‘ν΄μ€μΌ νλ€.
νλ² μμ±ν μ컀λ μλμΌλ‘ λ©μΆμ§ μκ³ κ³μν΄μ message
μ΄λ²€νΈλ₯Ό μμ λκΈ°νλ€.
λ°λΌμ λ μ΄μ μμ»€κ° νμνμ§ μμ κ²½μ°μλ λͺ μμ μΌλ‘ μ²λ¦¬λ₯Ό μ€μ§νκ±°λ μ’ λ£ν΄μΌ νλ€.
μ컀λ₯Ό μ’
λ£νλ λ°μλ terminate()
ν¨μμ close()
ν¨μλ₯Ό μ¬μ©ν μ μλ€.
terminateλ λ©μΈ μ½λμμ μ컀λ₯Ό μ’ λ£μν€λ ν¨μλ‘ μ컀μμ μμ λ°λ©μ κΈ°νλ₯Ό μ£Όμ§ μκ³ κ°μ λ‘ μ’ λ£μν¨λ€.
closeλ μ컀 λ΄λΆμμ μ¬μ©νλ ν¨μλ‘ μ컀 λ΄λΆ μμμ λ°λ©ν ν closeλ₯Ό νΈμΆνμ¬ μ컀λ₯Ό μ’ λ£νλ©΄ λλ€.
λ©μΈ μ½λ
var worker = new Worker("a.js");
worker.addEventListener("message", function(e) {
console.log(e.data);
});
worker.addEventListener("error", function(e) {
console.log("error: " + JSON.stringify(e));
});
worker.postMessage("test");
worker.postMessage("close");
a.js
// Worker κ°μ²΄μ λ©μλμΈ importScriptsλ₯Ό μ΄μ©ν΄ μ컀 λ΄λΆμμ λ€λ₯Έ μ€ν¬λ¦½νΈλ₯Ό μ¬μ¬μ©ν μ μλ€.
importScripts("b.js");
addEventListener("message", function(e) {
postMessage(e.data + "!");
if (e.data === "close") {
close();
}
});
λ©μΈ μ½λ
var worker = new SharedWorker("a.js");
worker.addEventListener("error", function(e) {
console.log("error: " + e.toString());
});
worker.addEventListener("message", function(e) {
console.log(e.data);
});
// νλμ 곡μ μ컀μλ μ°κ²°λ λ©μΈ μ½λλ³λ‘ portκ° ν λΉλλ€. portλ₯Ό ν΅ν΄ λ©μμ§λ₯Ό μ μ‘νλ€.
worker.port.postMessage("test");
// λ©μμ§ νμ μμ¬μλ λ©μμ§λ€μ 보λ΄κΈ° μμνλ ν¨μμ΄λ€.
// postMessageλ₯Ό ν΅ν΄ λ©μμ§λ₯Ό 보λ΄λλΌλ startκ° νΈμΆλμ§ μμΌλ©΄ λ©μμ§λ μ μ‘λμ§ μλλ€.
worker.port.start();
a.js
var ports = new Array();
var prev = "";
addEventListener("connect", function(e) {
var clientPort = e.ports[0];
ports.push(clinetPort);
clinetPort.addEventListener("message", function(e) {
prev += e.data;
for (var i = 0; i < ports.length; i++) {
ports[i].postMessage(e.data);
}
});
clientPort.start();
clientPort.postMessage(prev);
});
- λ¨μν μ€λ 걸리λ μ°μ°μ λ³λ μ€λ λλ‘ λ리λ μν
- μλ²μμ ν΅μ μ μ λ΄νλ λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€
μΉκΈ°λ° μ΄ν리μΌμ΄μ μ΄ μ€νλΌμΈμμλ μ€νλλλ‘ μ΄ν리μΌμ΄μ μΊμλ₯Ό μ 곡νλ€.
μ΄ν리μΌμ΄μ μΊμλ₯Ό νλ©΄ μλ²μ λΆνκ° μ€μ΄λ€κ³ 리μμ€ λ‘λ©μ΄ λΉ¨λΌμ§λ€.
μ΄ν리μΌμ΄μ
μΊμλ₯Ό μ¬μ©νκΈ° μν΄μ
html
νκ·Έμ manifest
μ΄νΈλ¦¬λ·°νΈλ₯Ό μ€μ νλ€.
manifest μ΄νΈλ¦¬λ·°νΈλ μΊμ 맀λνμ€νΈ ν μ€νΈ νμΌμ μ°Έμ‘°νλ€.
μ΄ν리μΌμ΄μ
λ΄μ λͺ¨λ νμ΄μ§μ manifest
μ΄νΈλ¦¬λ·°νΈλ₯Ό μΆκ°ν΄μΌ νλ€.
λ§μ½ manifest
μ΄νΈλ¦¬λ·°νΈλ₯Ό μ€μ νμ§ μμ νμ΄μ§κ° μλ€λ©΄ ν΄λΉ νμ΄μ§λ μΊμ±λμ§ μλλ€.
λ‘λ© κ³Όμ μ λ€μκ³Ό κ°λ€.
- μ΄ν리μΌμ΄μ μΊμκ° μλ€λ©΄ λΈλΌμ°μ λ λ€νΈμν¬μ μ°κ²°νμ§ μκ³ λ¨Όμ μΊμλ‘λΆν° νμ΄μ§ λ λλ§μ νμν 리μμ€λ₯Ό λ‘λνλ€.
- κ·Έ λ€μ μλ²μ μΊμ 맀λνμ΄μ€νΈ νμΌμ νμΈνμ¬ μ λ°μ΄νΈλ 리μμ€κ° μλμ§ μ²΄ν¬νλ€.
- μΊμ 맀λνμ€νΈ νμΌμ΄ μ λ°μ΄νΈ λμλ€λ©΄ μλ‘μ΄ λ²μ μ 맀λνμ€νΈ νμΌκ³Ό 리μμ€λ€μ λ€μ΄λ‘λ νλ€.
μΊμ 맀λνμ€νΈ νμΌμ 3κ°μ§ μΉμ μΌλ‘ λλμ΄ μλ€.
- CACHE
- κΈ°λ³Έμ μΈ μΉμ μΌλ‘ μ¬κΈ°μ 리μ€νΈμ λ 리μμ€λ μΊμ±λλ€.
- NETWORK
- μΊμ±κ³Ό μκ΄μμ΄ λ§€λ² λ€νΈμν¬ μμ²μ ν΄μΌνλ URL κ·μΉ
- FALLBACK
- 리μμ€ μμ²μ΄ μ€ν¨νμ λ λμ μμ²ν URL
맀λνμ€νΈ νμΌμ μμ²ν λ header μ 보μ Content-Typeμ text/cache-manifest
λ‘ μ€μ ν΄μΌ νλ€.
HTML νμΌμ μλμΌλ‘ μΊμ±λμ΄ λ²λ¦°λ€. κ·Έλμ HTML λ¬Έμλ₯Ό μμ ν΄λ μΊμ±λ λ¬Έμλ₯Ό λ‘λνκΈ° λλ¬Έμ μ μ©λμ§ μλλ€.
μ΄ κ²½μ°, 맀λνμ€νΈ νμΌμ λ³κ²½ν΄μ νμ΄μ§κ° μ λ°μ΄νΈ λλλ‘ ν΄μΌ νλ€.
μμ£Ό λ³κ²½λλ νμΌμ΄ μλ€λ©΄ NETWORK μΉμ μ μΆκ°ν΄μ μ§μμ μΌλ‘ μ λ°μ΄νΈ λλλ‘ νλ©΄ λλ€.
λ€ μ 리 μν΄μ£Όμ ¨λ€μ.
μ¬λ‘―λ©μ΄νΈ μ λν‘ νλ¬μ€μμ μΉμμΌ μ¬μ©ν μμ μΈλ° μ λν‘ νλ¬μ€ κ°λ°μλ€λ κ°μ΄ μ°Έμ¬ν μ μκ² κ³΅μ§ν κ²μ