data-source.js (1302B)
1 require('data-source', ['ajax', 'domchange'], function(ajax, onDomChange) { 2 function listen( element, event, handler ) { 3 if ( typeof element == 'string' ) { 4 handler = event; 5 event = element; 6 element = null; 7 } 8 if ( !element && event == 'change' ) { 9 onDomChange(handler,10); 10 return; 11 } 12 var add = element.addEventListener || element.attachEvent; 13 add = add.bind(element); 14 add(event,handler); 15 } 16 function render( template, data ) { 17 if ( Array.isArray(data) ) { 18 return data.map(render.bind(null,template)).join(''); 19 } 20 return template.format(data); 21 } 22 function process( element ) { 23 if(!element) { 24 document.querySelectorAll('[data-source]').forEach(process); 25 return; 26 } 27 if(!element.getAttribute) { 28 document.querySelectorAll('[data-source]').forEach(process); 29 return; 30 } 31 var template = element.innerHTML, 32 url = element.getAttribute('data-source'); 33 if ( url.indexOf('{') >= 0 ) { 34 return; 35 } 36 element.innerHTML = ''; 37 element.removeAttribute('data-source'); 38 ajax(url) 39 .then(function( data ) { 40 element.innerHTML = render(template,data); 41 }) 42 } 43 44 listen('change',process); 45 listen(document.body,'click',process); 46 process(); 47 });