[JavaScript] ๊ฐ์ธ ํ๋ก์ ํธ ์ค ๋งํ ๋ถ๋ถ - ํ๋กํ ์ฌ์ง ์ ์ฉํ๊ธฐ
๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ํ๋กํ ์ฌ์ง์ ์ ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ง๋ค์๋ค.
๋์ ๊ณํ์ ๋ค์๊ณผ ๊ฐ์๋ค.
- (์ด๊ธฐ์ ์ค์ ํ) ์ฌ์ฉ์์ด๋ฆ์ ์๋ก ๋ฐ๊ฟ ๋ , ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ํ๋กํ ์ฌ์ง์ ์ง์ ์ ํํ์ฌ ์ ์ฉํ ๊ฒฝ์ฐ localStorage์ ์ ์ฅ๋๋ค.
- ์๋ก๊ณ ์นจํ์ฌ๋ ๋ ๊ฐ์ด ์ ์ง๋๋ค.
- ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ํ๋กํ ์ฌ์ง์ ํ๋ฒ ๋ ์์ ํ๋ฉด ์์ ํ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
์ด ๊ธ์์๋ ์ฌ์ฉ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๋ถ๋ถ์ ์ค๋ช ํ์ง ์๊ณ ํ๋กํ ์ฌ์ง์ ์ ์ฉํ๋ ๊ฒ๋ง ๋ค๋ฃฌ๋ค.
(*css ์ฝ๋๋ ๋ฏธํฌํจ)
์ด๊ธฐ์ ์ค์ ํด๋ ์ฌ์ฉ์์ ์ด๋ฆ์ '์ถ์์ด'์ด๊ณ ํ๋กํ ์ฌ์ง์ ์๋ฌด๊ฒ๋ ์ง์ ์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์ ๋ํ๋๋ค.
๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ html์ ์ค์ ํ ๋ ์์ ๊ฐ์ด ์ค์ ํด์ฃผ์๋ค.
<div class="info">
<h2 class="userName"></h2>
<input type="text" class="userName_input" maxlength="12">
<input type="file" name="profile_img" accept="image/*" class="profile_img">
<figure class="profileImg_btn">
<img src="img/bros_blank.jpg" alt="๊ธฐ๋ณธ์ด๋ฏธ์ง">
</figure>
</div>
๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ๋ฉด ์ฌ์ง์ ๋ฐ๊ฟ ์ ์๋๋ก ํ์ผ ์ฐพ๊ธฐ ํ๋ฉด์ด ๋ฌ๋ค.
์ ๊ธฐ์ ์ฌ์ง์ ํ๋ ๊ณจ๋ผ ์ ์ฉํด๋ณธ๋ค.
์ ์ฉ์ด ์๋๋ค! ์๋ก ๊ณ ์นจ์ ํด๋ ์ด๊ธฐํ๋์ง ์๊ณ ์ ๋๋ก ๋ํ๋๋ค.
localStorage ์๋ ์ ๋๋ก ์ ์ฅ๋๊ณ ์๋ค. ์ฌ์ง์ด ๋ฐ๋ ๋๋ง๋ค ์ด๊ณณ์ ๊ฐ๋ ๋ฐ๋๋ค.
์์ค ์ฝ๋ (์ต์ข ์ฝ๋)
/* ํ๋กํ ์ฌ์ง */
const profileBtn = document.querySelector(".profileImg_btn");
const profileInput = document.querySelector(".profile_img");
const profileIcon = document.querySelector(".fa-user-plus");
const img = document.querySelector(".profileImg_btn img");
const fileTypes = [
"image/apng",
"image/bmp",
"image/gif",
"image/jpeg",
"image/pjpeg",
"image/png",
"image/svg+xml",
"image/tiff",
"image/webp",
"image/x-icon",
];
const NAME_KEY = "exam";
const PROFILE_IMG = "exImg";
/* ํ๋กํ ์ฌ์ง ๋ณ๊ฒฝ */
profileBtn.addEventListener("click", () => {
profileInput.click();
});
function handleProfileImg() {
// ์ ํํ ์ด๋ฏธ์ง ํ์ผ์ currentFiles ๋ณ์์ ๋ด๋๋ค.
const currentFiles = profileInput.files;
if (profileBtn.children.length > 0) {
// ํ๋กํ ์ฌ์ง์ด ๋๊ฐ์ด๋ฉด ์ฒ์ ์ฌ์ง์ ์ง์ฐ๊ณ ํ๋๋ง ๋์ด๋ค.
localStorage.removeItem(PROFILE_IMG);
//profileBtn.children[0].remove();
}
// ๋ง์ฝ, ํ์ผ์ด ์์ผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ ๋์ด๋ค.
if (currentFiles.length === 0) {
alert("No files currently selected for upload");
} else {
// for of ๋ ๋ฐฐ์ด
for (const file of currentFiles) {
// ๋ง์ฝ, file์ ํ์
์ด fileTypes ์ ํฌํจ๋๋ฉด
if (validFileType(file)) {
// FileReader ์ธ์คํด์ค ์์ฑ
const reader = new FileReader();
// ํ์ผ์ ์ฝ์์ ๋ ํด๋น ์ด๋ฒคํธ ์คํ
reader.addEventListener("load", () => {
// localStorage์ PROFILE_IMG ๋ฅผ key๋ก ๊ฐ์ง reader.result๋ฅผ ์ฝ๋๋ค.
localStorage.setItem(PROFILE_IMG, reader.result);
// reader.result๋ฅผ ์ด๋ฏธ์ง์ src์ ๋ฃ์ด ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
img.src = reader.result;
});
// ์
๋ก๋ ๋ ํ์ผ์ ์ ๋ณด๋ฅผ ์ฝ๋๋ค.
reader.readAsDataURL(file);
} else {
alert("Not a valid file type. Update your selection.");
}
}
}
function validFileType(file) {
return fileTypes.includes(file.type);
}
}
profileInput.addEventListener("change", handleProfileImg);
์์ ํ ๋ถ๋ถ
๊ธฐ์กด ์ฝ๋์์ ์์ ํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ๋ค.
// ์์ ์
localStorage.setItem(PROFILE_IMG, file.name);
loadImgUrl(reader.result);
.....
}
function loadImgUrl(DataUrl) {
const image = document.createElement("img");
//profileIcon.remove()
profileBtn.appendChild(image);
image.src = DataUrl;
}
// ์์ ํ
localStorage.setItem(PROFILE_IMG, reader.result);
img.src = reader.result;
......
- ์์ ์
localStotage์ PROFILE_IMG ๋ณ์์ ์ ์ฅ๋ ๊ฐ (key)์ ๊ฐ์ง file.name์ ์ฝ๊ณ ,
loadImgUrl() ํจ์๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์์ฑํ์ฌ profileBtn์ ์์ ์์๋ก ์ง์ ํ๋ค.
๊ทธ ํ, loadImgUrl ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์จ DataUrl์ ์๋กญ๊ฒ ์์ฑํ ์ด๋ฏธ์ง ํ๊ทธ์ src ๊ฐ์ผ๋ก ์ง์ ํ๋ค. - ์์ ํ
localStorage์ PROFILE_IMG ๋ณ์์ ์ ์ฅ๋ ๊ฐ (key)์ ๊ฐ์ง reader.result ๋ฅผ ์ฝ๊ณ ,
loadImgUrl() ํจ์๋ฅผ ์์ ์ญ์ ํ๊ณ ๊ณง๋ฐ๋ก ๋ณธ๋ ๊ธฐ๋ณธ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ img ํ๊ทธ์ src ๊ฐ์ผ๋ก reader.result๋ฅผ ์ง์ ํ๋ค.
์์ ์ ์ฝ๋๋ .. ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ์ง ๋ชฐ๋ผ ์ฌ๊ธฐ์ ๊ธฐ์์ ๋ณธ ๊ฒ์ ์ง์ง๊ธฐ ํด์ ๊ทธ๋ฐ์ง ใ
์ด๋ฏธ img ํ๊ทธ๊ฐ ์๋๋ฐ ์ฉ๋ฑ๋ง๊ฒ ๋ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ ํ๋กํ ์ฌ์ง์ ๋ฃ๊ณ ์๋ค.
๊ทธ๋ฌ๋ ๋น์ฐํ ์๋ก๊ณ ์นจํ๋ฉด ์ฌ๋ผ์ ธ์ ์๋ณด์ด์ง ...!!!ใ ใ ใ ํใ ใ
์๋ฑํ๊ฒ ์ฝ๋๋ฅผ ์ง๋๊ณ ์ค๋ ์๊ฐ ํค๋งธ๋ค๋๊ฒ ์ด์ด์๊ณ ์๊ธฐ๋ค.
๊ทธ์น๋ง ๊ทธ๋ ์ ~~~๋ง javascript ์ด๋ฐ์ด์์ ๋๊ณ ์ง๊ธ์ ๊ทธ๋๋ ๋ช๋ฒ ํด๋ดค๋ค๊ณ ์ฝ๋ ์ดํด๊ฐ ์กฐ๊ธ ๋ ์ฑ์ฅํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ๋ญ๊ฐ ์๋ชป๋๊ฑด์ง ๋ฐ๋ก ์์์ฐจ๋ฆด ์ ์๋๊ฑฐ๊ฒ ์ง?
๋๋ฆฌ์ง๋ง ์ฑ์ฅํ๊ณ ์๋ค๋ ์๊ฐ์ ๋๋ฌด ๋ฟ๋ฏํ๋ค!