ajax / hash / location.hash / hashBang / fetch API polyfill / < table >
ëŹë Ľ(Calendar) 꾏í ěě
ěíě˝ëŠ 2018 ajax ę°ě (11 ~ 16í¸) ě°¸ęł
<a href="#main">click</a> // í´ëŚí늴 (fragment identifier)
<!-- ě˝ë ě¤ëľ -->
<p id="main">lorem</p> // íëŠ´ě´ ěŹę¸°ëĄ ë°ë (fragment)
if (location.hash) {
console.log(location.hash); // #main
console.log(location.hash.substr(1)); // main
}
ě´ę¸° íě´ě§ëĽź ě¤ě íęł ě í ë ě´ëĽź ěěŠí ě ěë¤
ěźë°ě ě¸ ëśë§íŹ 기ëĽě ě미íë í´ěŹ(#)ě 꾏ëłí기 ěí´ ęˇ¸ ë¤ě ę´ěľě ěźëĄ ëëí(!)뼟 ëśěŹě íííë¤
đëĄ íěë ëśëś ëšęľ !
<body>
<h1><a href="#!welcome">WEB</a></h1>
<!-- đ ëŠë´ëĽź ë뼸 경ě°, 죟ě뼟 ë°ęž¸ęł (hashBang), í늴ě ěźëśëĽź ë°ęż(fetch API) -->
<li><a href="#!javascript" onclick="fetchPage('javascript')">JavaScript</a></li>
<article>
</article>
<script>
// fechPage í¨ě ě ě
function fetchPage (name) {
fetch(name).then(function(response){
response.text().then(function(text){
document.querySelector('article').innerHTML = text;
})
});
}
// đ 죟ěě°˝ě ~ #!... ëźęł ěłě ë¤ě´ě¨ 경ě°, ëł´ěŹě§ë 'ě´ę¸° íě´ě§' ě¤ě
if (location.hash) {
fetchPage(location.hash.substr(2));
} else {
fetchPage('welcome'); // 죟ěě°˝ě ~ index.html ë§ ěłě ë¤ě´ě¨ 경ě°, ëł´ěŹě§ë ě´ę¸° íě´ě§ ě¤ě
}
</script>
</body>
đĽ ě˝ë í´ě
- íě´ě§ ěěě JavaScript뼟 ę°ě¸ęł ěë đ a í꡸뼟 í´ëŚí늴,
(fetch APIě ěí´) í늴ě ěźëśę° ë°ë
ëż ěëëź
(hashBangě ěí´) url 죟ěë ë°ëë¤.
ex) ~ index.html#!javascript
- ë¤ëĽ¸ ěŹëě´ ęłľě ë ꡸ 죟ě뼟 íľí´ íě´ě§ě ě ꡟíě ë(ex. 죟ěě°˝ě ~ index.html#!javascript ě ë Ľ) ëę°ě í늴ě ëł´ěŹěŁźę¸° ěí´ if 쥰깴돸ě ěśę°íë¤.
(ěŹę¸°ě if 쥰깴돸ě ěśę°íě§ ěěźëŠ´, #!javascriptę° ëśě url 죟ěëĄ ë¤ě´ę°ë else ęľŹëŹ¸ě´ ěë¤ëŠ´ 기본 index.html í늴ěźëĄ ëě´)
if 쥰깴돸
í´ě
đ ë¤ëĽ¸ ěŹëě´ ęˇ¸ 죟ě뼟 íľí´ íě´ě§ě ě ꡟíě ë
ë§ě˝ íě´ě§ę° load ëě ë íě´ě§ě hashę°
ěěźëŠ´
, fetchPage í¨ě ěŚ, fetch API뼟 ě¤íěěźëź. fetchPage í¨ěě ě¸ěëĄë #!뼟 ě ě¸í ě¸ ë˛ě§¸ 돸ě ěŚ, javascript뼟 ëŁëëĄ í´ëź.ęˇ¸ëź fetch APIě ěí´ ěš ë¸ëźě°ě ę° ěš ěë˛ě javascriptë íěźě ěě˛íę˛ ëë¤
else 꾏돸
í´ě
- đ ë¤ëĽ¸ ěŹëě´ ęˇ¸ 죟ě뼟 íľí´ íě´ě§ě ě ꡟíě ë,
- ë§ě˝ íě´ě§ę° load ëě ë íě´ě§ě hashę°
ěěźëŠ´
, 'welcome'ě ě¸ěëĄ ëŁě fetchPage í¨ě뼟 ě¤íěěźëź.- ęˇ¸ëź fetch APIě ěí´ ěš ë¸ëźě°ě ę° ěš ěë˛ě welcomeě´ë íěźě ěě˛íę˛ ëë¤
đĄ hashBangě ë¨ě
- ě¤ě ëĄ index.html íěź ěŚ, ěš íě´ě§ěë ě˝í ě¸ ę° ěęł , ëëśëśě ě˝í ě¸ ë ë°ąěëěě ëě ěźëĄ ę°ě ¸ě¤ę¸° ë돸ě ę˛ěěě§ ěľě íę° ě´ë ľë¤
- ë¤ëĄ ę°ę¸° ë˛íźě ëë ě ë ë°ěě´ ěë¤
â ě´ëĽź í´ę˛°í기 ěí´
Pjax
ëźë ěëĄě´ API뼟 ě´ěŠí ě ěë¤
ë°ě´í°ě ëĄě§ ëë ë°ě´í°ě ě í댏ěźě´ě ě ěëĄ ęľŹëśëë¤.
ë°ě´í°
ë ë°ë ě ěë ëśëśě ë§íë¤. ě˝ëë ëŹźëĄ ë°ęż ě ěě§ë§, ě˝ëë íë˛ ě§ ëěźëŠ´ ëĄě§ě ěí´ ěěě ëěę°ëŻëĄ ë°ě´í°ě 꾏ëśëë¤.
ě´ë° ë°ě´í°ë ë°ëĄ ě¸ëśëĄ ëšźë´ě ëłëě íěźě ëęł ę´ëŚŹí늴 ě ěŠíë¤.
ě뼟 ë¤ě´, ěŹëŹ ę°ě < li ></ li >ę° ëŞ¨ěŹ ěë ëśëśě ë°ě´í°ě í´ëšíë¤. ě´ ëśëśë§ ë°ëĄ listëźë ě´ëŚě íěźě ë§ë¤ě´ ěŽę˛¨ě¨ë¤.
꡸ í, < ol > í꡸ě id뼟 navëĄ ě§ě í´ěŁźęł , fetch API뼟 ěśę°í´ listëźë íěźě ë¤ě´ ěë ë´ěŠě innerHtmlě íľí´ #navě ëŁëëĄ í ě ěë¤.
ě´ë ę˛ í늴 ë ě´ě ë°ě´í°ëĽź ěě íęł ě í ë index.htmlě ěě íě§ ěęł , ë°ě´í°ę° ë¤ě´ ěë listëźë íěźě ěě í늴 ëë¤.
ě´ë ę˛ ë°ě´í°ë§ ë°ëĄ ę´ëŚŹí¨ěźëĄě¨ ë§ěëëĄ ěě íë¤ę° ě길 ě ěë ěŹęł 뼟 ë°Šě§í ě ěë¤.
ěěě í 깸ě ë ëěę°
list íěźěě ëë¨¸ě§ ëśëśě ë¤ ě§ě°ęł
html,css,javascript
ëźęł ë§ ě¨ě¤ë
íě´ě§ě ę¸ ëŞŠëĄě´ ë¨ëëĄ ë§ë¤ě´ëł´ě
1)ě ęłźě ěě ěěąíë ě´ ě˝ë뼟
fetch('lilst').then(function(response){
response.text().then(function(text){
document.querySelector('#nav').innerHTML = text;
})
});
ěëě˛ëź ë°ężěŁźëŠ´ ëë¤
fetch('list').then(function(response){
response.text().then(function(text){
var items = text.split(',');
var tags = '';
for (var i = 0; i < items.length; i++) { // ę°ěěě while ë°ëłľëŹ¸ ěŹěŠ
var item = items[i];
var tag = `<li><a href="#!${item}"token interpolation">${item}', 'article')">${item}</a></li>`
tags = tags + tag;
}
document.querySelector('#nav').innerHTML = tags;
})
});
ë¸ëźě°ě í¸íěąě íëł´í기 ěí´ pollyfill
ě ě´ěŠí ě ěë¤
ě뼟 ë¤ě´, fetch API뼟 ě´ěŠí늴 ěë ë¸ëźě°ě ěěë fetch API뼟 ěëěíŹ ě ěë¤
ęľŹę¸ ę˛ě í ëě¤ë ě˝ë뼟 ë¤ě´ë°ěě ěŹěŠë˛ ě˝ě´ëł´ęł ꡸ëëĄ ě ěŠěí¤ëŠ´ ëë¤
ěěźëĄ ęłľëśí늴 ě˘ě ę˛ë¤
json
/ xml
pjax ( pushState + ajax )
ě§ę¸ęšě§ javascriptě ajax뼟 ě´ěŠí´
ěš íě´ě§ reload ěě´ ëśëśě ěźëĄ ë°ě´í° ęľě˛´ę° ę°ëĽí ě í댏ěźě´ě
ěŚ, SPA뼟 ë¤ë¤ë¤
ěŹę¸°ě pjax뼟 íěŠí늴
ëę°ě´ ěš íě´ě§ëĽź reload íě§ ěęł ëśëśě ěźëĄ ë°ě´í°ëĽź ęľě˛´í늴ěë
ajax뼟 ěźě ë ę˛ěěě§ ěľě íę° ě´ë ¤ě ë 돸ě 뼟 í´ę˛°í ě ěë¤
íëĄęˇ¸ë ě¤ ěš ěą (PWA)
ajax뼟 기ë°ěźëĄ ë§ë¤ě´ě§ ěźë ¨ě ě í댏ěźě´ě
SPA(single-page application)
spa뼟 기ë°ěźëĄ í늰 ě¤íëźě¸ěěë ëě ę°ëĽí ěš ěą
PWA(progressive web apps)
ě¸ě ë ěľě ěí뼟 ě ě§íë ěšě ě´ě ęłź ě¤íëźě¸ěěë ëě ę°ëĽí ěąě ě´ě ě 모ë ě´ëŚ´ ě ěë¤
<table></table>
ěśí ěě
<body>
<section>
<h1>Calendar</h1>
<!-- ëŹë Ľ Start -->
<div class="day-of-the-week-and-day">
<p class="day-of-the-week"></p>
<p class="day"></p>
</div>
<div class="month-and-year">
<span class="month"></span>
<span class="year"></span>
</div>
<div class="prev-calendar-next">
<button class="prev" type="button"><i class="fas fa-angle-double-left"></i></button>
<table class="calendar">
<colgroup span="7" class="columns">
<col class="sun-line">
<col class="weekday-line" span="5">
<col class="sat-line">
</colgroup>
<thead class="thead">
<tr>
<th>SUN</th>
<th>MON</th>
<th>TUE</th>
<th>WED</th>
<th>THU</th>
<th>FRI</th>
<th>SAT</th>
</tr>
</thead>
<tbody class="tbody">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<button class="next" type="button"><i class="fas fa-angle-double-right"></i></button>
</div>>
<!-- ëŹë Ľ End -->
</section>
</body>
ěśí ěě
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: white;
background-repeat: no-repeat;
background-size: cover;
font-family: "Varela Round", sans-serif;
}
h1 {
font-family: "Pacifico", cursive;
text-align: center;
font-size: 72px;
margin: 50px 0;
}
.day-of-the-week-and-day {
text-align: center;
}
.day-of-the-week,
.day {
font-size: 45px;
font-weight: bold;
margin: 20px;
}
.month-and-year {
text-align: center;
margin: 50px 0 30px 0;
}
.month,
.year {
font-size: 25px;
}
.prev-calendar-next {
display: flex;
justify-content: center;
}
button {
border-style: none;
background: transparent;
font-size: 30px;
margin: 20px;
}
/* calendar */
.sun-line {
background-color: #ffebed;
}
.weekday-line {
background-color: #ebebeb;
}
.sat-line {
background-color: #ebf2ff;
}
th {
padding: 10px 20px;
}
td {
text-align: center;
width: 50px;
height: 25px;
padding: 10px 20px;
}