์ฌ์ดํธ๋ช
: ์คํฌํฐํ์ด ๋ชจ๋ฐ์ผ
์์
๊ธฐ๊ฐ : 3์ผ
๋ผ์ด๋ธ๋ฌ๋ฆฌ : swiper, jQuery
์ ํ : ๋ชจ๋ฐ์ผ, ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ, ๋ฆฌ๋ด์ผ
ํ๋ฉด์์ ๋ณด์ฌ์ง๋ ๋ฐ์ดํฐ(View)์ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ(Model)๋ฅผ ๋ฌถ์ด์(Binding) ์๋ก ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด์ HTML์์ ์๋ฒ ํน์ ์คํฌ๋ฆฝํธ์์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์์ ๊ทธ๋ ค์ฃผ๊ณ ์๋ค๊ณ ๊ฐ์ ์ ํ์ ๋, ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋ ๊ฒฝ์ฐ ๋ค์ HTML ์์ ๋ฐ์ดํฐ(๊ฐ)๋ฅผ ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ฐ๋ผ์ ๋ง์ถ์ด ์ฃผ๋ ๋์์ '๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ'์ด๋ผ๊ณ ํ๋ค.
์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ ๋ทฐ์ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ๊ฒ์ด๋ค.
์ฆ ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ js์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๊ณ , js์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฌ์ฉ์์ ํ๋ฉด๋ ๋ณ๊ฒฝ๋๋ค.
๋ํ์ ์ธ ํ๋ ์์ํฌ๋ AngularJS๊ฐ ์๋ค.
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ ํ์ชฝ ๋ฐฉํฅ์ผ๋ก๋ง ์ ์ด๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ์๋ฏธํ๋ค.
js์์๋ ์ฌ์ฉ์์ ํ๋ฉด์ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ์ฌ์ฉ์๋ js์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ ์ผ๋ก ๋ณ๊ฒฝ์ํค์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ณํ๋ ๊ฐ์ ๊ฐ์งํ์ฌ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์์ผ์ฃผ์ด์ผ ํ๋ค.
๋ํ์ ์ธ ํ๋ ์์ํฌ๋ React๊ฐ ์๋ค.
์ฅ์ : ๋ฐ์ดํฐ ๋ณํ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ ํ ์์ด DOM ๊ฐ์ฒด ๊ฐฑ์ ๊ฐ๋ฅํ๋ค.
๋ํ ๋ฐ์ดํฐ ํ๋ฆ์ด ๋จ๋ฐฉํฅ(๋ถ๋ชจ->ํ์ ์ปดํฌ๋ํธ)์ด๋ผ, ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋ฐ์ดํฐ ์ถ์ ๊ณผ ๋๋ฒ๊น
์ด ์ฝ๋ค.
๋จ์ : ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํ๋ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํด์ผ ํ๋ค.
๋ฐ์ดํฐ ํต์ ์ผ๋ก โ์์ฒญ(Request)โ์ ํ์์ ๋, ์ด๋ ํ ์์ฒญ์ ๋ํ โ์๋ต(Response)'์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๊ฐ ์ํ๋๋ ์ฒ๋ฆฌ ๋ฐฉ์์ ์๋ฏธํ๋ค.
์นํ์ด์ง๋ฅผ ๋ฆฌ๋ก๋ํ์ง ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด๋ฉฐ Ajax๋ฅผ ํตํด์ ์๋ฒ์ ์์ฒญ์ ํ ํ ๋ฉ์ถ์ด ์๋ ๊ฒ์ด ์๋๋ผ ๊ทธ ํ๋ก๊ทธ๋จ์ ๊ณ์ ๋์๊ฐ๋ค.
Ajax
: Asynchronous Javascript And Xml(๋น๋๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์ xml)์ฅ์
๋จ์
JavaScript Object Notation
๋น๋๊ธฐํต์ ์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ๋ฐ์ดํฐ ๊ตํ ํ์
Javascript์ object(๊ฐ์ฒด)์ ๊ฐ์ด key(์์ฑ)-value(๊ฐ)๊ฐ ๋ฌถ์ฌ์ง ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
[
{
"title": "toystory",
"genre": ["animation","comic","kids"],
"age": 12
},
{
"title": "lalaland",
"genre": ["romance","musical"],
"age": 15
}
]
json
{
"items":[
{
"id":"1",
"sort":"1",
"snippet":{
"themeColor":"rgb(225, 51, 0);",
"thumbnail":"./assets/images/slide_spot_06.png",
"title":"๊ฐ์ฑ ์๋ ๋ฐค์ ์ฐ๋ฆด ์ค๋ ๊ฒ ํด์",
"desc":"#๊ตญ๋ด์ธ #์๋ฒฝ๊ฐ์ฑ #๊ฐ์ฑ์ ์ธ"
}
},
{
"id":"1",
"sort":"2",
"snippet":{
"themeColor":"rgb(245, 155, 35)",
"thumbnail":"./assets/images/slide_spot_13.png",
"title":"์ค๋๋ ๋ฐฉ๊ตฌ์ ๋๋ ์นซ",
"desc":"#๊ตญ๋ด #๊ฐ์ #๋ด์ ๋์ค #๊ธฐ๋ถ์ ํ"
}
},
{
"id":"1",
"sort":"3",
"snippet":{
"themeColor":"rgb(245, 155, 35)",
"thumbnail":"./assets/images/slide_spot3_13.jpg",
"title":"์ค๋๋ ๋ฐฉ๊ตฌ์ ๋๋ ์นซ",
"desc":"#๊ตญ๋ด #๊ฐ์ #๋ด์ ๋์ค #๊ธฐ๋ถ์ ํ"
}
}
]
}
Hot/New/Mood ํญ๋ฉ๋ด์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด์ ํด๋น๋ฐ์ดํฐ json ํ์ผ์ ๋ง๋ ๋ค.sort
๋ก ๋ฐ์ดํฐ์ข
๋ฅ๋ฅผ ๊ตฌ๋ถํด์ค๋ค.
jQuery
/**
* spot slide
* @sort
* [1-hot]
* [2-new]
* [3-mood]
* @data : mainProgramData
*/
function mainProgramData(sort){
fetch('./assets/data/mainProgramData.json')
.then((response) => response.json())
.then((json) => {
data = json.items;
result = (sort === '1') ? data : data.filter(function (parm) {return parm.sort == sort });
let html = '';
result.forEach(element => {
html+=` <div class="swiper-slide">
<div class="img-wrap" >
<div class="img-box" style="background:${element.snippet.themeColor}">
<img src="${element.snippet.thumbnail}" alt>
</div>
</div>
<div class="txt-box">
<strong class="title"><a href="">${element.snippet.title}</a></strong>
<p class="desc">${element.snippet.desc}</p>
</div>
</div>`
});
$('#dataList1').html(html)
var spotswiper = new Swiper('.spot-slide', {
slidesPerView: 'auto',
centeredSlides: true,
initialSlide: 5,
loop: true,
pagination: {
el: '.pagination',
clickable: true
},
});
})
}
mainProgramData();
result
๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด sort
๊ฐ [1-hot]
๋ฉ๋ด ์ผ ๊ฒฝ์ฐ data = json.items;
์ด ๋ํ๋๋๋ก ํ๋ค.
: data.filter(function (parm) {return parm.sort == sort });
๊ทธ๋ ์ง ์์๊ฒฝ์ฐ filter(items ํํฐ๋ง)
๋ฅผ ์ด์ฉํด์ ๋ถ๋ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๋ค.
markup
<ul class="tab-list">
<li class="tab-item on" data-sort="1"><a href="">Hot</a></li>
<li class="tab-item" data-sort="2"><a href="">New</a></li>
<li class="tab-item" data-sort="3"><a href="">Mood</a></li>
</ul>
ํญ ๋ฉ๋ด ๋งํฌ์
์ data-sort=""
๊ฐ์ ์ถ๊ฐํ์ฌ ํด๋น๋ฉ๋ด ํด๋ฆญ ์ ๋ถ๋ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๊ฒํ๋ค.
jQuery
$('.spot .tab-item').click(function(e){
e.preventDefault();
sort = $(this).data('sort');
$(this).addClass('on').siblings('li').removeClass('on')
mainProgramData(sort);
})
$(".spot .tab-item.on").trigger("click");
๋ณ์์ ์์ ๋ง๋ค์ด ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
ํด๋ฆญ์ ํด์ผ๋ง ๋ํ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ก ํ๋ฒ ํด๋ฆญํด์ฃผ๋ .trigger("click")
์ ํตํด ํด๋ฆญํ์ง ์์๋ ๋ณด์ผ ์ ์๋๋กํ๋ค.
json
"items":[
{
"id":"1",
"snippet":{
"thumbnail":"./assets/images/slide_schedule_01.jpg",
"date":"03์ 02์ผ",
"time":{
"starhours":"17",
"starMin":"30",
"endhours":"21",
"endMin":"30"
},
"title":"CRAVITY",
"desc":"Seoul EBS Studio Hall,Seoul"
}
},
]
jQuery
var now = new Date();
// ํ์ฌ์๊ฐ
var hours = now.getHours(); // ํ์ฌ ์๊ฐ
data.forEach(element => {
if((element.snippet.time.starhours - hours) <= 1 && (element.snippet.time.endhours - hours) >= 1){
live = 'on';
}else{
live = '';
}
ํ์ฌ์๊ฐ๊ณผ ๋ถ์ ๊ตฌํ๋ค.
์๊ฐ : console.log(์ค์ ์๊ฐ - ํ์ฌ์๊ฐ)
์ ํตํด ์์๊ฐ ๋์ฌ ๊ฒฝ์ฐ ์ค์ ๋ ์๊ฐ์ ์ด๋ฒคํธ๊ฐ ์งํ์ค์ธ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
if
์กฐ๊ฑด๋ฌธ์ ํตํด ์ด๋ฒคํธ ์์์๊ฐ์์ ํ์ฌ์๊ฐ์ ๋บ ๊ฐ์ด 1(์์)๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์๊ฒฝ์ฐ์ ๋๋๋์๊ฐ์ด ํ์ฌ์๊ฐ 1(์์)๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์๊ฒฝ์ฐ live์ด๋ผ๋ ์ด๋ฒคํธ๊ฐ on๋๊ฒ ํ๋ค.
markup
jQuery
$('.podcast .swiper-slide a').click(function(e){
e.preventDefault();
anchor = $(this).data('target');
anchorMove = $('.program').offset().top
$('html,body').animate({scrollTop:anchorMove-50});
$(anchor).addClass('on').siblings('.program .program-box').removeClass('on');
$('.program .tab-item').eq(2).trigger('click');
$('.category-box a').each(function(i,item){
if($(this).attr('href') == anchor){
$(this).parent().addClass('on').siblings().removeClass('on')
}
})
})
plumpsqrl9744.log : Javascript ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Data binding)
Georges Velog : ๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ๊ณผ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ
sunaaank.log : [WEB] ์๋ฐฉํฅ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
yenaryu.log : [Web] Json ๋ฐ์ดํฐ ํ์ฉ ๋ฐ ๋น๋๊ธฐํต์
Log : [Ajax] ๋น๋๊ธฐํต์ ์ด๋?