๐Ÿ„

008 Ajax

ย 
Ajax๋Š” (Asynchronous Javascript And Xml, ๋น„๋™๊ธฐ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ xml)์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.
ย 
  • ๋น„๋™๊ธฐ์ ์ธ ๋ฐฉ์‹ : ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ๋“ค์„ ๋ถ„์—…ํ™”ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ๋™๊ธฐ์ ์ธ ๋ฐฉ์‹ : ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๋งํ•ฉ๋‹ˆ๋‹ค.
ย 
์˜ˆ๋ฅผ ๋“ค์–ด sns์•ฑ์„ ์ผœ๊ณ  ํŽ˜์ด์ง€๋ฅผ ๋‚ด๋ฆฌ๋ฉด์„œ ํฌ์ŠคํŠธ๋“ค์ด ๋กœ๋”ฉ์ด ๋˜๊ฑฐ๋‚˜ ๋Œ“๊ธ€์„ ๋‹ฌ๊ฒŒ ๋˜๋ฉด ๋Œ“๊ธ€์„ ๋‹จ ๊ฒŒ์‹œ๋ฌผ์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋น„๋™๊ธฐ์ ์ธ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•˜๋ฉด, ๋™๊ธฐ์ ์ธ ๋ฐฉ์‹์€ ๋‹ค๋ฅธ ์ผ๋“ค์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
ย 
Ajax ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  php, python ๋“ฑ์„ ํ†ตํ•ด์„œ ์„œ๋ฒ„๋ฅผ ์—ด๊ฑฐ๋‚˜, ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WebStorm๊ณผ PhpStormWebStorm๊ณผ PhpStorm์€ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‰ฝ๊ฒŒ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
notion imagenotion image
ย 
notion imagenotion image
ย 
WebStorm๊ณผ PhpStorm๋ฅผ ์‚ฌ์šฉํ•˜์‹œ์ง€ ์•Š๋Š” ๋ถ„๋“ค์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ํ˜น์€ ์„œ๋ฒ„๋ฅผ ๋‹ค์šด๋ฐ›์•„์„œ ์ด์šฉํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ย 
์„œ๋ฒ„๋ฅผ ์—ฌ์…จ๋‹ค๋ฉด ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ์ข‹์•„์š”์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
XML http request๋ฅผ ์‚ฌ์šฉํ•œ Ajax๊ฐ€ ์‚ฌ์‹ค ๋ฐ”๋กœ ํ™œ์šฉํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ €ํฌ ๊ฐ•์˜์—์„œ๋Š”Jquery๋ฅผ ์‚ฌ์šฉํ•œ Ajax ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, Jquery๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Jquery ์—”์ง„์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ https://code.jquery.com/ ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์ธํ„ฐ๋„ท์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„๋•Œ๋งŒ Jquery ์—”์ง„์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์•ˆ๋œ ๋ถ„๋“ค์€ ์†Œ์Šค์ฝ”๋“œ์— ๋‹ค์šด๋กœ๋“œ ๋œ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
... <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <!--<script src="js/jquery-3.5.1.js"></script>--> <script src="js/main.js"></script> </body> </html>
ย 
Jquery๋ฅผ ์‚ฌ์šฉํ•œ Ajax ํ†ต์‹ ์€ $.ajax๋กœ ์‹œ์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค.
๋จผ์ €, type์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. type์€ GET๊ณผ POST๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ POST ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, type์€ Method๋กœ ๋ฐ”๊ฟ” ์ž…๋ ฅํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.
URL์— ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์„œ๋ฒ„์ธก์œผ๋กœ ๋ณด๋‚ผ ๋•Œ,
  • GET : ๋ฐ์ดํ„ฐ๋ฅผ url ๊ฒฝ๋กœ๋ฅผ ๋’ค์— ๋ถ™์—ฌ์„œ ๋ณด๋‚ธ๋‹ค
  • POST : ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ, url ๊ฒฝ๋กœ ์ƒ๋žตํ•˜๊ณ  ๋ณด๋‚ธ๋‹ค
ย 
ํŒŒ์ผ๋ช… : js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: 37, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; } }) }else if(elem.matches('[data-name="bookmark"]')){ console.log("๋ถ๋งˆํฌ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } ...
ย 
data: 37, let likecount =document.querySelector('#like-count-37'); ๋ถ€๋ถ„์€ ์›๋ž˜๋Š” data:[pk], ('#like-count-')+pk ๋กœ pk๋ฅผ ๋ฐ›์•„ ๊ฐ ์œ ์ €๋“ค์ด ๊ฐ–๊ณ ์žˆ๋Š” ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๋ฅผ ์ฐ์–ด์ฃผ๊ฑฐ๋‚˜ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค.
์ง€๊ธˆ ์ด ๋ถ€๋ถ„์€ backend๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž„์‹œ๋กœ ์ž‘์„ฑํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
ย 
์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์…จ๋‹ค๋ฉด data ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ์•ˆ์— like.json์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
notion imagenotion image
ย 
notion imagenotion image
ย 
ํŒŒ์ผ๋ช… : data/like.json
{ "like_count": 1, "message": "์ข‹์•„์š”" }
ย 
์•„๋ž˜ ์ฝ”๋“œ์—์„œ id๋ฅผ like-count-37๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. ์ด๋•Œ, ๋‹ค๋ฅธ article์—๋„ ์ ์šฉํ•ด ์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
... <div class="likes m_text"> ์ข‹์•„์š” <span id="like-count-37">2,346</span> ๊ฐœ </div> ...
ย 
๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธ€์ž๊ฐ€ ์ค‘๋ณต๋˜์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” HTML์—์„œ ๊ธฐ๋ณธ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ์ง€์›Œ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
notion imagenotion image
ย 
ํŒŒ์ผ๋ช… : index.html
... <div class="likes m_text"> <span id="like-count-37">2,346</span> </div> ...
ย 
๊ทธ๋Ÿฌ๋ฉด ํด๋ฆญํ•˜๋Š” ์ˆœ๊ฐ„ ๊ธ€์ž๊ฐ€ ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
notion imagenotion image
ย 
Ajax ํ†ต์‹ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ Network ํƒญ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํƒญ์€ ์„œ๋ฒ„์™€ ์–ด๋–ค ํ†ต์‹ ์„ ํ•˜์˜€๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ํƒญ์ž…๋‹ˆ๋‹ค.
notion imagenotion image
ย 
๋งŒ์•ฝ Ajax ํ†ต์‹ ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•˜ํŠธ๋ฅผ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ ์ข‹์•„์š”๋ผ๋Š” ๊ธ€์ž๊ฐ€ ๋‚˜์˜ค๊ณ  ํŽ˜์ด์ง€๊ฐ€ ๋ฆฌ๋กœ๋“œ ๋ฉ๋‹ˆ๋‹ค. Ajax ํ†ต์‹ ์„ ์ด์šฉํ•˜๊ณ  ํ•˜ํŠธ๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด like.json์ด๋ผ๋Š” ํด๋”๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ˜น์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ Ajax ํƒ€์ž…์„ GET์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์„ธ์š”!
notion imagenotion image
notion imagenotion image
ย 
๋˜ํ•œ Ajax ํ†ต์‹ ์ด ์•ˆ ๋œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋„ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: 37, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; }, error: function(request,status,error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="bookmark"]')){ console.log("๋ถ๋งˆํฌ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } ...
ย 
์ด๋ฒˆ์—” ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค. ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ๋„ ์ข‹์•„์š” ๊ธฐ๋Šฅ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ์—๋Š” pk ๊ฐ’์„ ๋ฐ›์•„์™€์„œ ์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•ด๋ณด๊ณ  ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ๋„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ backend ๊ตฌํ˜„์ด ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— html id ๊ฐ’๊ณผ name ๊ฐ’์„ 37๋กœ ์ž„์‹œ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  backend ๋ถ€๋ถ„์—์„œ name="{{pk}}"๋กœ ๋ฐ”๊ฟ”์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
... <div class="bottom_icons"> <div class="left_icons"> <div class="heart_btn"> <div class="sprite_heart_icon_outline" name="37" data-name="heartbeat"></div> </div> <div class="sprite_bubble_icon"></div> <div class="sprite_share_icon" data-name="share"></div> </div> <div class="right_icon"> <div class="sprite_bookmark_outline" name ="37" data-name="bookmark"></div> </div> </div> <div class="likes m_text"> <span id="like-count-37">2,346</span> <span id="bookmark-count-37"></span> </div> ...
ย 
ํŒŒ์ผ๋ช… : js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; }, error: function(request,status,error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ์‹คํ–‰ // console.log("๋ถ๋งˆํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งˆํฌ' + response.bookmark_count +'๊ฐœ'; }, error:function(request, status, error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } ...
ย 
๋˜ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ bookmark.json์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : data/bookmark.json
{ "bookmark_count": 1, "message": "๋ถ๋งˆํฌ" }
ย 
๊ทธ๋Ÿฌ๋ฉด ๋ถ๋งˆํฌ๋„ ์ž˜ ์ถœ๋ ฅ์ด ๋˜๊ณ  Ajax ํ†ต์‹ ๋„ ์ž˜ ๋˜์‹œ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
notion imagenotion image
ย 
notion imagenotion image
ย 
์ด์ œ ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์œผ๋กœ ๋„˜์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ data-name="comment"์™€ data-name=comment_delete๋ฅผ HTML ํŒŒ์ผ๊ณผ JS ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. comment๋Š” ๊ฒŒ์‹œ๋ผ๋Š” ๊ธ€์ž๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด comment๊ฐ€ ๋‹ฌ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
... <div class="comment_field" id="add-comment-post37"> <input type="text" placeholder="๋Œ“๊ธ€๋‹ฌ๊ธฐ..."> <div class="upload_btn m_text" data-name="comment">๊ฒŒ์‹œ</div> </div> ...
ย 
๋˜ํ•œ ์•„์ง ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•˜์˜€์„ ๋•Œ๋งŒ ๊ฒŒ์‹œ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ์ž„์‹œ๋กœ ๋ฒ„ํŠผ์—์„œ pointer-events:none; ๋ถ€๋ถ„์„ ์ง€์›Œ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : css/style.css
... .contents .comment_field .upload_btn{ color: #3897f0; position: absolute; right: 20px; top: 50%; transform: translateY(-50%); /* y์ถ•์œผ๋กœ ์ค‘์•™ ์ •๋ ฌ */ cursor: pointer; /* pointer-events: none; ์ฒ˜์Œ์—๋Š” ํด๋ฆญ์ด ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค */ opacity: 0.6; } ...
ย 
ํŒŒ์ผ๋ช… : js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; }, error: function(request,status,error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ์‹คํ–‰ // console.log("๋ถ๋งˆํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งˆํฌ' + response.bookmark_count +'๊ฐœ'; }, error:function(request, status, error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋Œ“๊ธ€์€ ์ตœ๋Œ€ 140์ž ์ž…๋ ฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋Š” ํ˜„์žฌ ํด๋”๋ฅผ ๋œปํ•จ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); } }) }else if(elem.matches('[data-name="comment_delete"]')){ // console.log("๋”๋ณด๊ธฐ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } ...
ย 
ํƒœ๊ทธ ์ž์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ insertAdjacentHTML ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
element.insertAdjacentHTML(position, text);
  • position : ์–ด๋Š ๋ถ€๋ถ„์—๋‹ค ์ถ”๊ฐ€ํ• ์ง€
  • text : ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ
ย 
notion imagenotion image
ย 
๋Œ“๊ธ€์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ๋„ ๊ฐ™์ด ๋งŒ๋“ค๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : comment.html
<div class="comment-detail"> <div class="nick_name m_text">kindtiger</div> <div>๊ฐ•์•„์ง€๊ฐ€ ๋„ˆ๋ฌด ๊ท€์—ฌ์›Œ~!~! <button data-name="comment_delete">์‚ญ์ œ</button></div> </div>
backend ๋ถ€๋ถ„์—์„œ ๋Œ“๊ธ€ ์ž…๋ ฅํ•œ ๊ฒƒ์€ ๊ฐ•์•„์ง€๊ฐ€ ๋„ˆ๋ฌด ๊ท€์—ฌ์›Œ~!~! ๋ถ€๋ถ„์— ๋‚˜ํƒ€๋‚˜๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
... <div class="comment_container"> <div class="comment" id="comment-list-ajax-post37"> <div class="nick_name m_text">dongdong2</div> <div>๊ฐ•์•„์ง€๊ฐ€ ๋„ˆ๋ฌด ๊ท€์—ฌ์›Œ์š”~!</div> </div> <div class="small_heart"> <div class="sprite_small_heart_icon_outline"></div> </div> </div> ...
ย 
notion imagenotion image
๊ธ€์ž๋ฅผ ์“ฐ๊ณ  ๊ฒŒ์‹œ๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ†ต์‹ ์ด ์ž˜ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜‘๊ฐ™์€ ๊ธ€์ž๊ฐ€ ๋“ค์–ด์˜ค๋Š” ์ด์œ ๋Š” comment.html ์— ์žˆ๋Š” ๊ธ€์ž๋ฅผ ์ฐ์–ด๋‚ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๊ธฐ์„œ comment-detail๋กœ ํ•œ๋ฒˆ ๊ฐ์‹ธ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— index.html ๋ถ€๋ถ„๋„ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
... <div class="comment_container"> <div class="comment" id="comment-list-ajax-post37"> <div class="comment-detail"> <div class="nick_name m_text">dongdong2</div> <div>๊ฐ•์•„์ง€๊ฐ€ ๋„ˆ๋ฌด ๊ท€์—ฌ์›Œ์š”~!</div> </div> </div> <div class="small_heart"> <div class="sprite_small_heart_icon_outline"></div> </div> </div> ...
ย 
comment-detail์ด ์Œ“์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋“ค์ด ์ง€๊ธˆ ๊ฐ€๋กœ ๋ฐฐ์น˜๊ฐ€ ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ธ๋กœ๋ฐฐ์น˜๊ฐ€ ๋˜๋„๋ก ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : css/style.css
... .contents .comment_container{ display:flex; /* ๊ฐ€๋กœ๋ฐฐ์น˜ */ justify-content: space-between; align-items: center; padding: 5px 20px; } .contents .comment_container .comment{ display:flex; /* ๊ฐ€๋กœ๋ฐฐ์น˜ */ flex-direction: column; font-size: 14px; } .contents .comment_container .comment-detail{ display: flex; /* ๊ฐ€๋กœ๋ฐฐ์น˜ */ } .contents .comment_container .comment .nick_name{ margin-right: 10px; /* ์•„์ด๋””์™€ ๋Œ“๊ธ€ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ ์„ค์ • */ } ...
ย 
notion imagenotion image
ย 
๊ฒŒ์‹œ ๋ฒ„ํŠผ์ด ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ ์ž…๋ ฅํ•œ ๊ธ€์ž๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
notion imagenotion image
ย 
ํŒŒ์ผ๋ช… : js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; }, error: function(request,status,error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ์‹คํ–‰ // console.log("๋ถ๋งˆํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งˆํฌ' + response.bookmark_count +'๊ฐœ'; }, error:function(request, status, error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋Œ“๊ธ€์€ ์ตœ๋Œ€ 140์ž ์ž…๋ ฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋Š” ํ˜„์žฌ ํด๋”๋ฅผ ๋œปํ•จ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); } }) document.querySelector('#add-comment-post37>input[type=text]').value=''; }else if(elem.matches('[data-name="comment_delete"]')){ // console.log("๋”๋ณด๊ธฐ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } ...
ย 
๋Œ“๊ธ€ ์‚ญ์ œ๋ถ€๋ถ„๋„ ๋Œ“๊ธ€ ์ถ”๊ฐ€๋ถ€๋ถ„๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ง„ํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; }, error: function(request,status,error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ์‹คํ–‰ // console.log("๋ถ๋งˆํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งˆํฌ' + response.bookmark_count +'๊ฐœ'; }, error:function(request, status, error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋Œ“๊ธ€์€ ์ตœ๋Œ€ 140์ž ์ž…๋ ฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋Š” ํ˜„์žฌ ํด๋”๋ฅผ ๋œปํ•จ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); } }) document.querySelector('#add-comment-post37>input[type=text]').value=''; }else if(elem.matches('[data-name="comment_delete"]')){ $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url:'data/delete.json', data: { 'pk': 37, /* 'pk':pk */ }, dataType:'json', success: function(response){ if(response.status){ let comt = document.querySelector('.comment-detail'); comt.remove(); } }, error:function(request, status ,error){ alert('๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค..'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } ...
ย 
delete.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : data/delete.json
{ "message": "์‚ญ์ œ์™„๋ฃŒ", "status": "1" }
ย 
์ž˜ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฒ„ํŠผ์ด ์‚ญ์ œ๋˜๊ณ  Ajax ํ†ต์‹ ๋„ ์ด๋ฃจ์–ด์ง€๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
notion imagenotion image
ย 
์™„์„ฑ๋œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ย 
ํŒŒ์ผ๋ช… : index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>Title</title> <link rel="stylesheet" href="css/reset.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <section id="container"> <header id="header"> <section class="inner"> <h1 class="logo"> <a herf="index.html"> <div class="sprite_insta_icon"></div> <div class="sprite_write_logo"></div> </a> </h1> <div class="search_box"> <input type="text" placeholder="๊ฒ€์ƒ‰" id="search-field"> <div class="fake_field"> <span class="sprite_small_search_icon"></span> <span>๊ฒ€์ƒ‰</span> </div> </div> <div class="right_icons"> <div class="sprite_camera_icon"></div> <div class="sprite_compass_icon"></div> <div class="sprite_heart_icon_outline"></div> <div class="sprite_user_icon_outline"></div> </div> </section> </header> <!--**ํ‘œ์‹œ๊นŒ์ง€ ๋ฐ˜๋ณต--> <div class="hidden_menu"> <div class="scroll_inner"> <div class="user"> <div class="thumb_img"><img src="imgs/thumb.jpeg" alt="ํ”„๋กœํ•„์‚ฌ์ง„"></div> <div class="id">kindtigerrr</div> </div> </div> </div> <!--**--> <section id="main_container"> <div class="inner"> <div class="contents_box"> <article class="contents"> <header class="top"> <div class="user_container"> <div class="profile_img"> <img src="imgs/thumb.jpeg" alt="ํ”„๋กœํ•„์ด๋ฏธ์ง€"> </div> <div class="user_name"> <div class="nick_name m_text">KindTiger</div> <div class="country s_text">Seoul, South Korea</div> </div> </div> <div class="sprite_more_icon" data-name="more"></div> </header> <div class="img_section"> <div class="trans_inner"> <div> <img src="imgs/img_section/img01.jpg" alt="visual01"> </div> </div> </div> <div class="bottom_icons"> <div class="left_icons"> <div class="heart_btn"> <div class="sprite_heart_icon_outline" name="39" data-name="heartbeat"></div> </div> <div class="sprite_bubble_icon"></div> <div class="sprite_share_icon" data-name="share"></div> </div> <div class="right_icon"> <div class="sprite_bookmark_outline" data-name="bookmark"></div> </div> </div> <div class="likes m_text"> <span id="like-count-37">2,346</span> <span id="bookmark-count-37"></span> </div> <div class="comment_container"> <div class="comment" id="comment-list-ajax-post37"> <div class="comment-detail"> <div class="nick_name m_text">dongdong2</div> <div>๊ฐ•์•„์ง€๊ฐ€ ๋„ˆ๋ฌด ๊ท€์—ฌ์›Œ์š”~!</div> </div> </div> <div class="small_heart"> <div class="sprite_small_heart_icon_outline"></div> </div> </div> <div class="timer">1์‹œ๊ฐ„ ์ „</div> <div class="comment_field" id="add-comment-post37"> <input type="text" placeholder="๋Œ“๊ธ€๋‹ฌ๊ธฐ..."> <div class="upload_btn m_text" data-name="comment">๊ฒŒ์‹œ</div> </div> </article> </div> <div class="side_box"> <div class="user_profile"> <div class="profile_thumb"> <img src="imgs/thumb.jpeg" alt="ํ”„๋กœํ•„์‚ฌ์ง„"> </div> <div class="detail"> <div class="id m_text">KindTiger</div> <div class="ko_name">์‹ฌ์„ ๋ฒ”</div> </div> </div> <article class="story"> <header class="story_header"> <div>์Šคํ† ๋ฆฌ</div> <div class="more">๋ชจ๋‘ ๋ณด๊ธฐ</div> </header> <div class="scroll_inner"> <div class="thumb_user"> <!--**ํ‘œ์‹œ๊นŒ์ง€ ๋ฐ˜๋ณต--> <div class="profile_thumb"> <img src="imgs/thumb02.jpg" alt="ํ”„๋กœํ•„์‚ฌ์ง„"> </div> <div class="detail"> <div class="id">kind_tigerrrr</div> <div class="time">1์‹œ๊ฐ„ ์ „</div> </div> <!--**--> </div> </div> </article> <article class="recommend"> <header class="reco_header"> <div>ํšŒ์›๋‹˜์„ ์œ„ํ•œ ์ถ”์ฒœ</div> <div class="more">๋ชจ๋‘ ๋ณด๊ธฐ</div> </header> </article> </div> </div> </section> </section> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <!--<script src="js/jquery-3.5.1.js"></script>--> <script src="js/main.js"></script> </body> </html>
ย 
ํŒŒ์ผ๋ช… : css/style.css
.sprite_insta_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -53px -235px; width: 22px; height: 22px; } .sprite_write_logo{ display: inline-block; background: url('../imgs/background01.png') no-repeat -94px -72px; width: 103px; height: 29px; } .sprite_compass_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -130px -286px; width: 23px; height: 23px; } .sprite_user_icon_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -272px -182px; width: 22px; height: 24px; } .sprite_heart_icon_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -52px -261px; width: 24px; height: 22px; } .sprite_small_search_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -337px -246px; width: 10px; height: 10px; } .sprite_more_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -301px -218px; width: 15px; height: 3px; } .sprite_bubble_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -239px -202px; width: 24px; height: 24px; } .sprite_share_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -324px -52px; width: 21px; height: 24px; } .sprite_bookmark_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -237px -286px; width: 19px; height: 24px; } .sprite_bookmark_outline.on { background: url('../imgs/background01.png') no-repeat -159px -286px; width: 19px; height: 24px; } .sprite_bookmark_outline.on{ background: url('../imgs/background01.png') no-repeat -159px -286px; width: 19px; height: 24px; } .sprite_small_heart_icon_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -323px -274px; width: 12px; height: 11px; } .sprite_camera_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -271px -104px; width: 24px; height: 22px; } .sprite_insta_big_logo{ display: inline-block; background: url('../imgs/background02.png') no-repeat -98px -150px; width: 175px; height: 51px; } .sprite_plus_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -187px -202px; width: 23px; height: 23px; } body{ background: #fafafa; } #header{ width: 100%; /* ๊ณต์ค‘์— ๋œจ๊ธฐ ์œ„ํ•จ */ position: absolute; /* ๊ฐ€์žฅ ์œ„์— ์˜ฌ๋ผ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ์œ„ํ•จ */ z-index: 999; /* absolute์˜ ๊ฒฝ์šฐ ์ตœ์†Œ x์ถ•์—์„œ 1๊ฐœ y์ถ•์—์„œ 1๊ฐœ์˜ ๊ฐ’์„ ์ฃผ์–ด์•ผ ํ•จ */ left: 0; top: 0; background: white; border-bottom: 1px solid rgba(0,0,0,0.1); } #header.on{ position: fixed; /* ์ƒ๋‹จ์— ๊ณ ์ •๋˜์„œ ๊ฐ™์ด ์›€์ง์ž„ */ } #header .inner{ /* inner ์•ˆ์— ์ปจํ…์ธ ๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ์— ๊ฐ’์ด ๋“ค์–ด์˜ด */ width: 975px; height: 77px; margin: 0 auto; /* ๊ฐ€์šด๋ฐ ์ •๋ ฌ */ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ justify-content: space-between; /* x์ถ• ์ •๋ ฌ_๊ณต๊ฐ„์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐํ•จ */ align-items: center; /* y์ถ• ์ •๋ ฌ */ transition: all 1s; /* ์ž์—ฐ์Šค๋Ÿฌ์šด ํšจ๊ณผ */ } #header.on .inner{ height: 52px; } #header .inner .logo > a{ color: transparent; /* ๋ฐฐ๊ฒฝ์ƒ‰์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ฌ */ } #header .inner .logo div{ vertical-align: middle; } #header .inner .logo .sprite_insta_icon{ position: relative; /* after์—๊ฒŒ ์œ„์น˜ ๊ธฐ์ค€์„ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ์œ„ํ•จ */ margin-right: 30px; } #header .inner .logo .sprite_insta_icon:after{ content: ''; /* ๊ณต๋ฐฑ์„ ๋ฐ›์•„์˜ด */ width: 1px; height: 28px; background: #000; position: absolute; /* ๋ถ€๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜๋ฅผ ์žก์Œ */ right: -15px; top: -4px; transition: all .5s; } #header .search_box{ position: relative; /* ๊ธฐ์ค€์ ์„ ์žก๊ณ  ๊ฐ€๋กœ ๋ฐฐ์น˜ */ } #search-field{ width: 185px; height: 28px; background: #fafafa; border: 1px solid #dbdbdb; border-radius: 3px; padding: 3px 30px; /* ์œ„์•„๋ž˜ ์–‘์ชฝ */ color: #999; font-weight: 400; text-align: left; /* ๊ธ€์ž ์ž…๋ ฅ ์‹œ ์™ผ์ชฝ๋ถ€ํ„ฐ ๋ณด์ด๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ */ font-size: 14px; outline: none; /* ํฌ์ปค์Šค ํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํŒŒ๋ž€์„  */ } #search-field::placeholder{ /* ์ฝœ๋ก 2๊ฐœ(::) - ์†์„ฑ์„ ํƒ์ž */ font-size: 0; /* ํฌ์ปค์Šค๊ฐ€ ๋˜์ง€ ์•Š์„ ๋•Œ ๊ฒ€์ƒ‰ ๊ธ€์ž๊ฐ€ ๋ณด์ด์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ */ } #search-field:focus::placeholder{ font-size: 14px; /* ํฌ์ปค์Šค ๋˜์—ˆ์„ ๋•Œ ๊ฒ€์ƒ‰ ๊ธ€์ž๊ฐ€ ๋ณด์ด๋„๋ก ํ•œ๋‹ค */ } #header .search_box .fake_field{ position: absolute; /* ๊ฒ€์ƒ‰ ์ฐฝ ์œ„์— ๊ธ€์ž๋ฅผ ๋ณด์ด๊ธฐ ์œ„ํ•จ */ /* ๊ฐ€์šด๋ฐ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณต์‹ */ left: 50%; top: 50%; transform: translate(-50%, -50%); pointer-events: none; /* ๊ฒ€์ƒ‰์„ ๋ˆŒ๋ €์„ ๋•Œ์—๋Š” ํฌ์ธํ„ฐ ์ธ์‹์ด ์•ˆ ๋จ */ } /* ๋ฌผ๊ฒฐ(~) - ๊ทผ์ฒ˜์— ์žˆ๋Š” fake_field */ #search-field:focus~.fake_field > span:nth-child(1){ transform: translateX(-105px); /* ๋‹๋ณด๊ธฐ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ */ } #search-field:focus~.fake_field > span:nth-child(2){ display: none; /* ํฌ์ปค์Šค ๋˜์—ˆ์„ ๋•Œ ๊ธ€์ž ์ˆจ๊ธฐ๊ธฐ */ } #header .right_icons{ width: 132px; /* ๋ถ€๋ชจ๊ฐ’ ์ขŒ์šฐ๊ฐ’ ๊ณ ์ • */ display: flex; justify-content: space-between; /* x์ถ• ์ •๋ ฌ_๊ณต๊ฐ„์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐํ•จ */ } #header .inner .logo div:nth-child(2){ transform: translateY(2px); transition:all .5s; } #header.on .inner .logo .sprite_insta_icon:after{ opacity:0; } #header.on .inner .logo div:nth-child(2){ opacity:0; } /* ์•„์ด์ฝ˜ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋Š” ๋ถ€๋ถ„ */ #header .inner .logo .sprite_insta_icon{ position: relative; /* after์—๊ฒŒ ์œ„์น˜ ๊ธฐ์ค€์„ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ์œ„ํ•จ */ margin-right: 30px; } #main_container{ padding-top: 130px; display: flex; /* ์ปจํ…์ธ ๊ฐ€ ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ */ justify-content: center; /* x์ถ• ๊ฐ€์šด๋ฐ ์ •๋ ฌ */ } #main_container .inner{ width: 935px; /* height: 500px; */ /* background: red; */ position: relative; /* ๊ธฐ์ค€์ ์„ inner๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•จ */ } .contents_box{ } .contents{ width: 614px; /* height: 500px; */ border: 1px solid rgba(0,0,0,0.09); border-radius: 3px; /* ํ…Œ๋‘๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ๋งŒ๋“ฌ */ margin-bottom: 60px; /* ๋‹ค๋ฅธ contents๋“ค์ด ๋ฐ€๋ ค์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ด์— ์—ฌ๋ฐฑ์„ ์ค€๋‹ค */ background: white; } .contents .top{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ justify-content: space-between; /* x์ถ• ์ •๋ ฌ_๊ณต๊ฐ„์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐ */ align-items: center; padding: 10px 20px; /* ์œ„์•„๋ž˜ ์–‘์ชฝ */ } .contents .top .profile_img{ width: 32px; height: 32px; border-radius: 50%; /* ํ…Œ๋‘๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ์„ค์ • 50% -> ์›์˜ ํ˜•ํƒœ */ overflow: hidden; /* ์ž์‹์ด ํฌ๊ธฐ๊ฐ€ ๋„˜์น˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค */ margin-right: 10px; } .contents .top .profile_img img{ width: 100%; /* 100%๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ */ } .contents .top .user_container{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ } .m_text{ font-size: 14px; font-weight: bold; } .s_text{ font-size: 12px; } .contents .img_section{ overflow: hidden; /* ์ž์‹์ด ๋ถ€๋ชจ์˜ ํฌ๊ธฐ๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค */ } .contents .img_section img{ width: 100%; /* ๋ถ€๋ชจ์˜ ํฌ๊ธฐ 100%๋ฅผ ๋ฐ›๋Š”๋‹ค */ } .contents .bottom_icons{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ justify-content: space-between; /* x์ถ• ์ •๋ ฌ_๊ณต๊ฐ„์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐํ•จ */ align-items: center; /* y์ถ• ๊ฐ€์šด๋ฐ ์ •๋ ฌ */ padding: 10px 20px; } .contents .bottom_icons .left_icons{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ } .contents .bottom_icons .left_icons > div{ margin-right: 10px; } /* .heart_btn.on .sprite_heart_icon_outline */.sprite_heart_icon_outline.on{ background: url('../imgs/background01.png') no-repeat -26px -261px; } .contents .likes{ padding: 5px 20px; color: #262626; } .contents .comment_container{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ justify-content: space-between; align-items: center; padding: 5px 20px; } .contents .comment_container .comment{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ flex-direction: column; font-size: 14px; } .contents .comment_container .comment-detail{ display: flex; /* ๊ฐ€๋กœ๋ฐฐ์น˜ */ } .contents .comment_container .comment .nick_name{ margin-right: 10px; /* ์•„์ด๋””์™€ ๋Œ“๊ธ€ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ ์„ค์ • */ } .contents .comment_container .comment .nick_name{ margin-right: 10px; /* ์•„์ด๋””์™€ ๋Œ“๊ธ€ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ ์„ค์ • */ } .contents .timer{ font-size: 10px; letter-spacing: 0.2px; /* ์ž๊ฐ„ ์กฐ์ • */ color: #999; border-bottom: 1px solid rgba(0,0,0,0.09); /* ์•„๋ž˜์ชฝ ์‹ค์„  ์ถ”๊ฐ€ */ padding: 10px 20px; } .contents .comment_field{ min-height: 56px; padding: 0 20px; position: relative; /* ์ž์‹๋“ค์ด absolute๋กœ ์ž๋ฆฌ๋ฅผ ์žก๊ธฐ ์œ„ํ•จ */ } .contents .comment_field input{ width: 100%; height: 56px; border: none; outline: none; background: transparent; /* ํˆฌ๋ช…ํ•˜๊ฒŒ ์„ค์ • */ } .contents .comment_field input:focus ~ .upload_btn{ pointer-events: initial; /* ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ ์ดˆ๊ธฐํ™” */ opacity: 1; } .contents .comment_field .upload_btn{ color: #3897f0; position: absolute; right: 20px; top: 50%; transform: translateY(-50%); /* y์ถ•์œผ๋กœ ์ค‘์•™ ์ •๋ ฌ */ cursor: pointer; /* pointer-events: none; ์ฒ˜์Œ์—๋Š” ํด๋ฆญ์ด ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค */ opacity: 0.6; } .contents .bottom_icons .right_icon > div{ cursor: pointer; /* ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ */ } .side_box{ width: 293px; /* height: 300px; */ /* background: rgba(255,0,0,0.16); */ position: absolute; /* ๋ถ€๋ชจ๋ฅผ ๊ฐ–๋Š” ๊ธฐ์ค€์ ์„ ์žก์ง€ ์•Š์œผ๋ฉด ๊ผญ๋Œ€๊ธฐ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ */ right: 0; top: 0; } .side_box.on{ position: fixed; /* ํ™”๋ฉด์— ๊ณ ์ • */ top: 80px; } .side_box .profile_thumb{ width: 50px; height: 50px; border-radius: 50%; overflow: hidden; /* ์ด๋ฏธ์ง€๊ฐ€ ๋„˜์น˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค */ margin-right: 10px; } .side_box .profile_thumb img{ width: 100%; height: 100%; } .side_box .user_profile{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ align-items: center; font-size: 14px; color: #262626; } .side_box .detail .id{ margin-bottom: 5px; } .side_box .detail .ko_name{ font-size: 12px; color: #999; } .side_box > article{ border: 1px solid rgba(0,0,0,0.09); border-radius: 3px; margin-bottom: 20px; width: 291px; font-size: 14px; color: #262626; font-weight: bold; background: white; } .side_box > article > header{ display: flex; /* ๊ฐ€๋กœ ๋ฐฐ์น˜ */ align-items: center; justify-content: space-between; padding: 15px 20px; color: #999; } .side_box > article > header .more{ font-size: 12px; color: #262626; cursor: pointer; } .thumb_user{ display: flex; align-items: center; padding: 10px 20px; } .thumb_user .profile_thumb{ width: 34px; /* ํฌ๊ธฐ๊ฐ€ ์ข€ ๋” ์ž‘๊ฒŒ ๋งŒ๋“ฌ */ height: 34px; } .thumb_user .time{ font-size: 10px; letter-spacing: 0.2px; color: #999; } .side_box .scroll_inner{ height: 182px; overflow-x: hidden; /* x์ถ•_์ž์‹์ด ๋ถ€๋ชจ ๋„˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค */ overflow-y: auto; /* ์ž๋™์œผ๋กœ ์Šคํฌ๋กค์„ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์ˆจ๊น€ */ /* overflow: hidden auto; x์ถ•, y์ถ• ํ•œ๋ฒˆ์— ์„ค์ • */ } .hidden_menu{ display: none; width: 600px; /* background: red; */ position: absolute; left: 50%; transform: translateX(-50%); /* x์ถ• ๊ฐ€์šด๋ฐ ์ •๋ ฌ */ top: 100px; overflow: hidden; /* ์ž์‹๋“ค์ด ๋„˜์น˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค */ border: 1px solid rgba(0,0,0,0.09); border-radius: 3px; } .hidden_menu .scroll_inner{ height: 100px; /* ๋†’์ด๊ฐ’์„ ์ž์‹์—๊ฒŒ ์ค€๋‹ค */ width: auto; overflow-x: auto; /* ํ•ญ๋ชฉ์ด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์•Œ์•„์„œ ์Šคํฌ๋กค์ด ์ƒ์„ฑ */ overflow-y: hidden; display: flex; /* ๊ฐ€๋กœ๋ฐฐ์น˜ */ align-items: center; padding: 0 10px; } .hidden_menu .scroll_inner .user{ width: 80px; height: 80px; display: flex; flex-direction: column; /* ๊ฐ€๋กœ ์ค‘์•™ ์ •๋ ฌ์„ ์„ธ๋กœ ์ค‘์•™ ์ •๋ ฌ๋กœ ๋ณ€๊ฒฝ */ align-items: center; margin-right: 15px; justify-content: space-between; /* ์ด๋ฏธ์ง€๋Š” ์œ„๋กœ ์•„์ด๋””๋Š” ์•„๋ž˜๋กœ ์„ค์ • */ } .hidden_menu .scroll_inner .user .id{ font-size: 12px; color: #262626; } .hidden_menu .thumb_img{ width: 56px; height: 56px; border-radius: 50%; overflow: hidden; } .hidden_menu .thumb_img img{ width: 100%; height: 100%; } @media screen and (max-width:1000px){ #header .inner{ width: 97.5%; } #main_container{ padding-top: 220px; } #main_container .inner{ width: 93.5%; } .contents_box{ display: flex; flex-direction: column; /* ์„ธ๋กœ ๋ฐฐ์น˜ ๋ฐ›๋„๋ก ํ•œ๋‹ค */ align-items: center; /* ์™ผ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ ์ง€๋Š” ๊ฑธ ๋ฐฉ์ง€ */ } .side_box{ /* ์‚ฌ์ด๋“œ ๋ฐ•์Šค ์ˆจ๊ธฐ๊ธฐ */ display: none; } .hidden_menu{ display: block; } } @media screen and (max-width:650px){ #header .search_box{ display: none; } .hidden_menu{ width: 95%; } }
ย 
ํŒŒ์ผ๋ช… : js/main.js
/* const heart = document.querySelector( '.heart_btn'); // ํ•˜ํŠธ ์š”์†Œ ๋ถ€๋ถ„์„ ์„ ํƒํ•ด์„œ ๊ฐ€์ ธ์˜ด */ const header = document.querySelector('#header'); const sidebox = document.querySelector( '.side_box'); // SelectorAll์„ ํ™œ์šฉํ•ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ด const variableWidth = document.querySelectorAll(".contents_box .contents"); const deligation = document.querySelector(".contents_box"); /* heart.addEventListener('click', function(){ console.log('hit'); heart.classList.toggle('on'); // ํ•˜ํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด .on ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ }); */ function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ•œ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ // console.log(e.target); // console.log(elem); // ์ž˜๋ชป ํด๋ฆญํ•œ ๊ฒฝ์šฐ while(!elem.getAttribute('data-name')){ // elem์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ์Œ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ elem=null; return; } // data-name์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ์—๊ฒŒ ์ ‘๊ทผ์„ ๋ฐ˜๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํ•˜ํŠธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', // ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ฌ์ง€ ์„ค์ • success: function(response){ // ํ†ต์‹ ์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ response๋กœ ๋“ค์–ด์˜จ๋‹ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข‹์•„์š”' + response.like_count +'๊ฐœ'; }, error: function(request,status,error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ์‹คํ–‰ // console.log("๋ถ๋งˆํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งˆํฌ' + response.bookmark_count +'๊ฐœ'; }, error:function(request, status, error){ alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋Œ“๊ธ€์€ ์ตœ๋Œ€ 140์ž ์ž…๋ ฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋Š” ํ˜„์žฌ ํด๋”๋ฅผ ๋œปํ•จ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); } }) document.querySelector('#add-comment-post37>input[type=text]').value=''; }else if(elem.matches('[data-name="comment_delete"]')){ $.ajax({ Method:'POST', /* ์—๋Ÿฌ๋‚  ๊ฒฝ์šฐ GET์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ */ url:'data/delete.json', data: { 'pk': 37, /* 'pk':pk */ }, dataType:'json', success: function(response){ if(response.status){ let comt = document.querySelector('.comment-detail'); comt.remove(); } }, error:function(request, status ,error){ alert('๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค..'); window.location.replace('https://www.naver.com'); // ์ž„์‹œ ์—๋Ÿฌ ์›น ํŽ˜์ด์ง€ } }) }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์œ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋”๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋ž˜์Šค ์ฃผ๊ธฐ } function resizeFunc(){ // console.log('resize!!'); if(pageYOffset >= 10){ let calcWidth = (window.innerWidth *0.5) +167; // ์›น ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ„์น˜ ์žฌ์กฐ์ • // console.log(window.innerWidth); sidebox.style.left = calcWidth +'px'; } if(matchMedia('screen and (max-width : 800px)').matches){ // ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…์ธ  ๋ฐ•์Šค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ์—ด ํ™œ์šฉ for(let i=0; i<variableWidth.length; i++){ variableWidth[i].style.width = window.innerWidth -20 +'px'; } }else{ for(let i=0; i<variableWidth.length; i++){ if(window.innerWidth >600) // ๋””ํดํŠธ ๊ฐ’์ด 614 ์ด๋ฏ€๋กœ 614 ์ด์ƒ ์ปค์ง€์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ variableWidth[i].removeAttribute('style'); } } } function scrollFunc(){ // console.log(pageYOffset); if(pageYOffset >= 10){ // ๋“œ๋ž˜๊ทธํ•  ๊ฒฝ์šฐ header.classList.add('on'); if(sidebox){ sidebox.classList.add('on'); }resizeFunc(); }else{ header.classList.remove('on'); if(sidebox){ sidebox.classList.remove('on'); sidebox.removeAttribute('style'); } } } setTimeout(function (){ scrollTo(0,0); },100); // ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ํ™”๋ฉด์ด ์ ค ์œ„๋กœ ๊ฐ€๋„๋ก ํ•œ๋‹ค if(deligation){ deligation.addEventListener('click',deligationFunc); } window.addEventListener( 'resize', resizeFunc); window.addEventListener('scroll', scrollFunc); // ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ scrollFunc ์‹คํ–‰