XML 파일 비동기 통신
XML 파일을 비동기 통신 하여 브라우저에 불러오는 실습을 한다.
[].map.call()
→$.map()
으로 변경
// json 실습에서 사용할 수 있도록 Dom.js에 함수 추가
Dom.map = function (list, callback) {
return [].map.call(list, callback)
}
;(function (global, $, ajax) {
'use strict'
var $menu = $('.ediya-menu')
ajax.get('/data/ediya-menu.xml').then(function (xmlDoc) {
// XML -> 데이터 추출
var names = xmlDoc.querySelectorAll('name')
names = $.map(names, function (name) {
return name.textContent
})
var widths = xmlDoc.querySelectorAll('width')
widths = $.map(widths, function (width) {
return width.textContent
})
var heights = xmlDoc.querySelectorAll('height')
heights = $.map(heights, function (height) {
return height.textContent
})
var kos = xmlDoc.querySelectorAll('ko')
kos = $.map(kos, function (ko) {
return ko.textContent
})
var ens = xmlDoc.querySelectorAll('en')
ens = $.map(ens, function (en) {
return en.textContent
})
var descs = xmlDoc.querySelectorAll('desc')
descs = $.map(descs, function (desc) {
return desc.textContent
})
var display = xmlDoc.querySelectorAll('display-criteria')
display = $.map(display, function (criteria) {
var items = criteria.querySelectorAll('item')
var keyMaps = $.map(items, function (item) {
var key = item.querySelector('key').textContent
var value = item.querySelector('value').textContent
return [key, value]
})
return keyMaps
})
// 추출한 데이터 -> 템플릿 바인딩
var template = $.template(names, function (name, i) {
var templ =
'\
<li class="ediya-menu__item">\
<a href="#">\
<figure>\
<img src="https://raw.githubusercontent.com/yamoo9/assets/master/images/ediya/' +
names[i] +
'.png" alt width="' +
widths[i] +
'" height="' +
heights[i] +
'">\
<figcaption>' +
kos[i] +
'</figcaption>\
</figure>\
</a>\
<div hidden class="ediya-menu__item--detail">\
<strong class="ediya-menu__item--name">' +
kos[i] +
'<span lang="en">' +
ens[i] +
'</span></strong>\
<p>' +
descs[i] +
'</p>\
<div class="ediya-menu__item--multi-column is-2"><p>\
'
templ += $.template(display, function (item, index) {
if (i === index) {
return $.template(item, function (it) {
var key = it[0]
var value = it[1]
return '<span>' + key + '<b>(' + value + ')</b></span>'
})
}
})
templ +=
'</p></div><button type="button" class="button is-close-panel" aria-label="아이템 소개 패널 닫기">×</button></div></li>'
return templ
})
$menu.html(template)
})
})(window, Dom, ajax)
// var template = '\
// <li class="ediya-menu__item">\
// <a href="#">\
// <figure>\
// <img src="https://raw.githubusercontent.com/yamoo9/assets/master/images/ediya/'+ name +'.png" alt width="'+ width +'" height="'+ height +'">\
// <figcaption>'+ ko +'</figcaption>\
// </figure>\
// </a>\
// <div hidden class="ediya-menu__item--detail">\
// <strong class="ediya-menu__item--name">'+ ko +'<span lang="en">'+ en +'</span></strong>\
// <p>'+ desc +'</p>\
// <div class="ediya-menu__item--multi-column is-2"><p>\
// ';
// template += _.template(display, function(item){
// return '<span>'+ item[0] +'<b>('+ item[1] +')</b></span>';
// });
// template += '</p></div><button type="button" class="button is-close-panel" aria-label="아이템 소개 패널 닫기">×</button></div></li>';
<body>
<!-- XML / JSON -->
<header class="app-header">
<h1 class="brand">
<a href="https://www.ediya.com/" target="_blank">
<span class="a11y-hidden">EDIYA COFFEE</span>
</a>
</h1>
<button type="button" class="button is-open">
<img src="https://raw.githubusercontent.com/yamoo9/assets/master/images/ediya/navigation-button.gif" alt="메뉴 열기">
</button>
<nav hidden class="app-navigation">
<ul class="reset-list">
<li><a href="#">메뉴</a></li>
<li><a href="#">이디야멤버스</a></li>
<li><a href="#">이디야커피랩</a></li>
<li><a href="#">이디야컬쳐랩</a></li>
<li><a href="#">공지사항</a></li>
<li><a href="#">매장찾기</a></li>
</ul>
<button type="button" class="button is-close-menu" aria-label="메뉴 닫기">×</button>
</nav>
</header>
<main class="app-main">
<ul class="ediya-menu reset-list"></ul>
</main>
<script src="./js/ajax.js"></script>
<script src="./js/Dom.js"></script>
<script src="./js/action.js"></script>
</body>
<?xml version="1.0" encoding="UTF-8"?>
<ediya-menus>
<menu-item>
<figure>
<name>ICED-벚꽃라떼</name>
<width>323</width>
<height>323</height>
</figure>
<detail>
<ko>ICED 벚꽃라떼</ko>
<en>Cherry Blossom Latte</en>
<desc>은은한 벚꽃향과 라즈베리 화이트 초콜릿 토핑이 올라간 핑크빛 라떼</desc>
<display-criteria>
<item>
<key>칼로리</key>
<value>393kcal</value>
</item>
<item>
<key>당류</key>
<value>35g</value>
</item>
<item>
<key>단백질</key>
<value>7g</value>
</item>
<item>
<key>포화지방</key>
<value>18.6g</value>
</item>
<item>
<key>나트륨</key>
<value>149mg</value>
</item>
<item>
<key>카페인</key>
<value>0mg</value>
</item>
</display-criteria>
</detail>
</menu-item>
<menu-item>
<figure>
<name>HOT-벚꽃라떼</name>
<width>323</width>
<height>323</height>
</figure>
<detail>
<ko>HOT 벚꽃라떼</ko>
<en>Cherry Blossom Latte</en>
<desc>은은한 벚꽃향과 라즈베리 화이트 초콜릿 토핑이 올라간 핑크빛 라떼</desc>
<display-criteria>
<item>
<key>칼로리</key>
<value>430kcal</value>
</item>
<item>
<key>당류</key>
<value>38g</value>
</item>
<item>
<key>단백질</key>
<value>10g</value>
</item>
<item>
<key>포화지방</key>
<value>19.0g</value>
</item>
<item>
<key>나트륨</key>
<value>149mg</value>
</item>
<item>
<key>카페인</key>
<value>0mg</value>
</item>
</display-criteria>
</detail>
</menu-item>
<menu-item>
<figure>
<name>ICED-브라우니-쇼콜라</name>
<width>323</width>
<height>323</height>
</figure>
<detail>
<ko>ICED 브라우니 쇼콜라</ko>
<en>Brownie Chocolate</en>
<desc>깊고 진한 초콜릿의 맛에 부드러운 휘핑크림과 브라우니를 함께 어울러져 고급스러운 디저트 같은 초콜릿 음료</desc>
<display-criteria>
<item>
<key>칼로리</key>
<value>503kcal</value>
</item>
<item>
<key>당류</key>
<value>42g</value>
</item>
<item>
<key>단백질</key>
<value>9g</value>
</item>
<item>
<key>포화지방</key>
<value>20.8g</value>
</item>
<item>
<key>나트륨</key>
<value>262mg</value>
</item>
<item>
<key>카페인</key>
<value>12mg</value>
</item>
</display-criteria>
</detail>
</menu-item>
<menu-item>
<figure>
<name>HOT-브라우니-쇼콜라</name>
<width>323</width>
<height>323</height>
</figure>
<detail>
<ko>HOT 브라우니 쇼콜라</ko>
<en>Brownie Chocolate</en>
<desc>깊고 진한 초콜릿의 맛에 부드러운 휘핑크림과 브라우니를 함께 어울러져 고급스러운 디저트 같은 초콜릿 음료</desc>
<display-criteria>
<item>
<key>칼로리</key>
<value>503kcal</value>
</item>
<item>
<key>당류</key>
<value>42g</value>
</item>
<item>
<key>단백질</key>
<value>9g</value>
</item>
<item>
<key>포화지방</key>
<value>20.9g</value>
</item>
<item>
<key>나트륨</key>
<value>299mg</value>
</item>
<item>
<key>카페인</key>
<value>12mg</value>
</item>
</display-criteria>
</detail>
</menu-item>
<menu-item>
<figure>
<name>제주청귤-오리지널</name>
<width>323</width>
<height>323</height>
</figure>
<detail>
<ko>제주청귤 오리지널</ko>
<en>Jeju Green Tangerine Tea</en>
<desc>청정 제주지역에서 자라난 귀한 청귤의 풍부한 과육을 맛볼 수 있는 새콤달콤한 홈메이드 스타일 과일차</desc>
<display-criteria>
<item>
<key>칼로리</key>
<value>218kcal</value>
</item>
<item>
<key>당류</key>
<value>51g</value>
</item>
<item>
<key>단백질</key>
<value>0g</value>
</item>
<item>
<key>포화지방</key>
<value>0.1g</value>
</item>
<item>
<key>나트륨</key>
<value>4mg</value>
</item>
<item>
<key>카페인</key>
<value>0mg</value>
</item>
</display-criteria>
</detail>
</menu-item>
</ediya-menus>
var template = '\
<li class="ediya-menu__item">\
<a href="#">\
<figure>\
<img src="https://raw.githubusercontent.com/yamoo9/assets/master/images/ediya/'+ name +'.png" alt width="'+ width +'" height="'+ height +'">\
<figcaption>'+ ko +'</figcaption>\
</figure>\
</a>\
<div hidden class="ediya-menu__item--detail">\
<strong class="ediya-menu__item--name">'+ ko +'<span lang="en">'+ en +'</span></strong>\
<p>'+ desc +'</p>\
<div class="ediya-menu__item--multi-column is-2"><p>\
';
template += _.template(display, function(item){
return '<span>'+ item[0] +'<b>('+ item[1] +')</b></span>';
});
template += '</p></div><button type="button" class="button is-close-panel" aria-label="아이템 소개 패널 닫기">×</button></div></li>';
XML을 사용하지 않는 이유
XML파일의 태그는 사용자가 정의하여 임의로 작성할 수 있다. 그리고 파일의 중첩도 높아질 수록 데이터를 가져오는 것이 여간 힘들 일이 아니다 (물론 라이브러리를 만들면 가능하다.) 그렇기 때문에 최근에는 XML을 사용하지 않고 이보다 더 간편하게 만들 수 있는 json을 사용한다.
Last updated