์ด ์ฅ์์๋ HTML5 API์ธ ๋๋๊ทธ ์ค ๋๋กญ API
, Blob API
, File API
, Web Workers API
๋ฅผ ๋ฐฐ์ฐ๊ณ ์ด๋ฅผ ํ์ฉํ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์๋ค.
<div draggable="true">๋๋๊ทธ ํ ์ ์์ต๋๋ค.</div>
์ด๋ฒคํธ ์ด๋ฆ | ์ค๋ช |
---|---|
dragstart | ๋๋๊ทธ ์์ํ ๋ ๋ฐ์ |
drag | ๋๋๊ทธ ํ๋ ๋์ ๋ฐ์ |
dragend | ๋๋๊ทธ ๋๋ ๋ ๋ฐ์ |
dragenter | ๋ง์ฐ์ค ํฌ์ธํฐ ๋๋กญ ์์ ์์ชฝ์ผ๋ก ๋ค์ด๊ฐ ๋ ๋ฐ์ |
dragover | ๋ง์ฐ์ค ํฌ์ธํฐ ๋๋กญ ์์ ์์ชฝ์ ์์ ๋ ๋ฐ์ |
dragleave | ๋ง์ฐ์ค ํฌ์ธํฐ ๋๋กญ ์์ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ ๋ ๋ฐ์ |
drop | ์์์ ๋๋กญํ ๋ ๋ฐ์ |
๋๋๊ทธ ์ค ๋๋กญ ์ด๋ฒคํธ๋ dataTransfer
ํ๋กํผํฐ๋ฅผ ๊ฐ๊ณ ์๊ณ , dataTransfer
์ DataTransfer
๊ฐ์ฒด์ด๋ค.
์ ๋ฌ ์์
dragstart
์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ ์์์ setData
๋ฉ์๋์ ๋ฐ์ดํฐ ํ์
์ ์ง์ ํ ๋ฐ์ดํฐ ์ถ๊ฐe.dataTransfer.setData("text/plain", value);
dragover
์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ ์์์ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋์์ ์ทจ์ํ๋ค.e.preventDefault();
getData
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ ๋ฐ์ดํฐ ํ์
์ผ๋ก ๊ฐ์ ธ์จ๋ค.var value = e.dataTransfer.getData("text/plain");
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ด๋ฏธ์ง, ์์ฑ, ์์ ๋ฑ์ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ
์ BLOB (Binary Large Object) ์์ ์ ๋ํ๋ค. ์ด๋ฏธ์ง๋ ์์ฑ ๋ฑ์ ๋ฉํฐ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ DB์ BLOB์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ Blob
๊ฐ์ฒด๋ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
var blob = new Blob(source, { type: contentType });
Blob์ด ๋ฐ๋ ์ธ์์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํ๋กํผํฐ ์ด๋ฆ/ ๋ฉ์๋ ์ด๋ฆ | ์ค๋ช |
---|---|
size | Blob ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ |
type | Blob ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ์ MIME ํ์ ์ ๋ปํ๋ ๋ฌธ์์ด |
slice(start, end, contentType) | ๋ฒํผ์ start ๋ถํฐ end ๊น์ง์ ๋ณต์ฌ๋ณธ์ Blob๊ฐ์ฒด๋ก ๋ฐํ |
Blob ์์ฑ์๋ก ์์ฑ
Blob ์์ฑ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ArrayBuffer๋ ํ์ํ ๋ฐฐ์ด ๋ฑ์ด ์์๋ก ๋ด๊ธด ๋ฐฐ์ด์ ๋๊ธฐ๋ฉด Blob ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
XMLHttpRequest๋ก ์น์ ๋ฐ์ดํฐ๋ฅผ HTTP ํต์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
function getBlob(url, callback) {
var req = new XMLHttpRequest();
req.onload = function () {
callback(req.response);
};
req.open("GET", url);
req.responseType = "blob";
req.send(null);
}
postMessage๋ก ๋ค๋ฅธ ์๋์ฐ๋ ์ค๋ ๋์์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
postMessage ํจ์ ์ฌ์ฉ
ํ์ผ์์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
<input type="file" />
์์๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ์ ์ฝ์ด๋ค์ฌ์ ๊ทธ๊ฒ์ File ๊ฐ์ฒด๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
File ๊ฐ์ฒด๋ ๋ก์ปฌ ํ์ผ์ ์ฐธ์กฐํ๋ Blob ๊ฐ์ฒด์ด๊ณ , ๋ก์ปฌ ํ์ผ์ ์ฝ๊ฑฐ๋ ์ธ ์ ์๋ค.
File ๊ฐ์ฒด๋ Blob ๊ฐ์ฒด๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด์ด๋ค.
ํ๋กํผํฐ | ์ค๋ช |
---|---|
lastModified | File ๊ฐ์ฒด๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ๋ ์ง (๋จ์ ๋ฐ๋ฆฌ์ด) |
lastMOdifiedDate | File ๊ฐ์ฒด๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ๋ ์ง (Date ๊ฐ์ฒด) |
name | File ๊ฐ์ฒด๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์ ์ด๋ฆ |
๋ก์ปฌ ํ์ผ์ File ๊ฐ์ฒด๋ก ๋ถ๋ฌ๋ค์ด๋ ๋ฐฉ๋ฒ
<!-- ์ฌ์ฉ์๊ฐ input ๋ฒํผ์ ํด๋ฆญํด์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. -->
<input type="file" />
<!-- ์ฌ์ฉ์๊ฐ shift๋ฅผ ๋๋ฌ์ ์ค๋ณต ์ ํ์ ํ ๋ ์ฌ์ฉ -->
<input type="file" multiple />
<!-- ์ ํํ ์ ์๋ ํ์ผ ์ ํ์ MIME ํ์
์ผ๋ก ์ง์ ๊ฐ๋ฅ -->
<input type="file" accept="image/*" />
element.ondrop = function (e) {
var files = e.dataTransfer.files;
};
Blob ๊ฐ์ฒด์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ ๋ฉ์๋๊ฐ ์๋ค.
FileReader
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด Blob ๊ฐ์ฒด, File ๊ฐ์ฒด์ ๋ด์ฉ๋ฌผ์ ์ฝ์ ์ ์๋ค.
FileReader
์ธ์คํด์ค ์์ฑ
var reader = new FileReader();
์ฝ๊ณ ์ ํ๋ Blob ๊ฐ์ฒด๋ฅผ ์ ์ ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ ์์์ 4๊ฐ์ ๋ฉ์๋ ์ค ํ๋์ ๋๊ธด๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
readAsText(blob, [, encoding]) | ํ ์คํธ ํ์์ผ๋ก ์ฝ๊ธฐ |
readAsArrayBuffer(blob) | ArrayBuffer ํ์์ผ๋ก ์ฝ๊ธฐ |
readAsDataURL(blob) | data URL์ด ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ์ฝ๊ธฐ |
readAsBinaryString(blob) | ์ด์ง ๋ฐ์ดํฐ ํ์์ผ๋ก ์ฝ๊ธฐ |
Blob์ Blob์ ๊ฐ๋ฆฌํค๋ URL์ ๊ฐ์ง ์ ์๋ค. ์ด๋ฅผ Blob URL
์ด๋ผ๊ณ ํ๋ค.
Blob URL์ ๊ฐ์ ธ์ค๋ ค๋ฉด URL.createObjectURL ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
var blobURL = URL.createObjectURL(blob);
๊ทธ๋ฌ๋ฉด "blob : "์ผ๋ก ์์ํ๋ ๋ฌด์์ ๋ฌธ์์ด์ด Blob ๊ฐ์ฒด์ Blob URL๋ก ์ค์ ๋๊ณ ์ด๊ฒ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
var a = new Uint8Array([1, 2, 3]);
var blob = new Blob([a], { type: "application/octet-binary" });
var blobURL = URL.createObjectURL(blob);
console.log(blobURL); // blob:null/~~~
// revokeURL ํจ์๋ก ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ ์ ์๋ค.
URL.revokeURL(blobURL);
var blobURL = URL.createObjectURL(blob);
var img = document.createElement("img");
img.src = blobURL;
var blobURL = URL.createObjectURL(blob);
var img = document.createElement("img");
img.onload = function () {
ctx.drawImage(img, 0, 0);
URL.revokeObjectURL(this.src);
};
img.src = blobURL;
var blobURL = URL.createObjectURL(blob);
var req = new XmlhttpRequest();
req.onload = funtion() {
callback(req.responseText);
};
req.open("GET", blobURL);
req.send(null);
ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋์ด๋ค. ํ์ง๋ง ๋ธ๋ผ์ฐ์ ๋ Single Thread๋ก ๋์ํ์ง ์๋๋ค. Web Workers
๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์์
์ ๋ฉํฐ ์ค๋ ๋๋ก ์คํํ ์ ์๋ค. Web Workers
์์ ๋ณ๋ ฌ๋ก ์คํ๋๋ ์ค๋ ๋๋ ์์ปค ๋ผ๊ณ ํ๋ค.
์์ปค์ ๋ฉ์ธ ์ค๋ ๋๋ ๋ค๋ฅธ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ฉฐ, ์๋๋ฐฉ์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ๋ํ postMessage๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ํต์ ๋ง ๊ฐ๋ฅํ๋ค.
Web Workers๋ก ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
Worker ๊ฐ์ฒด ์์ฑํ๊ธฐ
๋จผ์ ์์ปค๋ฅผ ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ง๋ ๋ค.
var worker = new Worker("worker.js");
์์ปค์ ๋ฉ์์ง ๋ณด๋ด๊ธฐ / ๋ฐ๊ธฐ
postMessage๋ก ์์ปค์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์๋ค.
worker.postMessage("message");
์์ปค์์ ๋ฉ์์ง๋ฅผ ๋ฐ๊ธฐ ์ํด์ message ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฑ๋กํด์ผํ๋ค.
self.onmessage = function(e) {
var message = e.data;
...
}
์์ปค์์ ๋ฉ์ธ ์ค๋ ๋๋ก ๋ฉ์์ง ๋ณด๋ด๊ธฐ / ๋ฐ๊ธฐ
์์ปค์์ ๋ฉ์ธ ์ค๋ ๋๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ ์ํด postMessage ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
self.postMessage("message");
์์ปค์์ ๋ฉ์ธ ์ค๋ ๋๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ ค๋ฉด message ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฑ๋กํด์ผํ๋ค.
worker.onmessage = function(e) {
var message = e.data;
...
}
์์ปค ์ค๋ ๋ ๊ฐ์ ์ข
๋ฃ / ์ค์ค๋ก ์ข
๋ฃ
๊ฐ์ ์ข
๋ฃ
worker.terminate();
์ค์ค๋ก ์ข ๋ฃ
close();
์ธ๋ถ ์คํฌ๋ฆฝํธ ์ฝ์ด ๋ค์ด๊ธฐ
importScripts("scripts.js");
importScripts
ํจ์๋ก ์ธ๋ถ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฝ์ด ๋ค์ผ ์ ์๋ค.
Web Workers
์ ์์ปค๋ฅผ ํ์ฉํ์ฌ ๋ฌด์จ ์ผ์ ํ ์ ์๋์ง ์ ๋ฆฌํด๋ณด์. ํนํ Blob
์ ์ฝ์ด ๋ค์ด๋ ์์
๊ณผ XMLHttpRequest
๋ฅผ ์ฌ์ฉํ ํต์ ์์
์ ๋๊ธฐ์ ์ผ๋ก ์คํ ํ ์ ์๋ค.
์์ปค์๋ ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์ฌ์์ด ํฌํจ๋์ด ์๋ค.
์์ปค์ ์ ์ญ ๊ฐ์ฒด๋ self, this๋ก ์ฐธ์กฐ ๊ฐ๋ฅ
ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ์ ์๋ ์ผ๋ถ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
setTimeout()
, setInterval()
๋ฑ
์ผ๋ถ HTML5 API๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Blob()
, FileAPI()
๋ฑ
๊ณต์ ์์ปค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ณต์ ์์ปค๋ ์ฌ๋ฌ ์์ปค์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์ ์๋ ์์ปค์ด๋ค. ShareWorker
์์ฑ์๋ก ์์ฑ ๊ฐ๋ฅ