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>';
XML을 사용하지 않는 이유
XML파일의 태그는 사용자가 정의하여 임의로 작성할 수 있다. 그리고 파일의 중첩도 높아질 수록 데이터를 가져오는 것이 여간 힘들 일이 아니다 (물론 라이브러리를 만들면 가능하다.) 그렇기 때문에 최근에는 XML을 사용하지 않고 이보다 더 간편하게 만들 수 있는 json을 사용한다.
Last updated
Was this helpful?