UNPKG

sliderjs

Version:

lightweight slideshow engine using CSS, Canvas and WebGL Transitions

105 lines (93 loc) 3.28 kB
//~~~ Slides sliderjs.modules("slides", function (sandbox, $) { var node, nodes, images, loading, tmpl = $.tmpl('<div class="slides"><% if(obj.slides){for(var i=0;i<slides.length;++i){var s=slides[i]; %> <div class="slide"> <% if(s.link){ %><a target="_blank" href="<%= s.link %>"><% } %> <img src="<%= s.image %>"><% if(s.legend){ %><span class="caption"><%= s.legend %></span> <% } if(s.link){ %></a><% } %> </div> <% }} %> </div>'); function template () { return tmpl({ slides: sandbox.value() }); } function syncHeight (h) { var hpx = h ? h+"px" : ""; node && $.height(node, hpx); } function onHeightChanged (o) { syncHeight(o.value); } function syncWidth (w) { var wpx = w ? w+"px" : ""; nodes && $.each(nodes, function (node) { $.width(node, wpx); }); } function onWidthChanged (o) { syncWidth(o.value); } function syncSlide (value, old) { if(!nodes) return; var oldN = nodes[old], valueN = nodes[value]; oldN && $.removeClass(oldN, "current"); valueN && $.addClass(valueN, "current"); } function onTemplated (n) { node = n[0]; if (!node) return; nodes = $.find(node, ".slide"); syncSlide (sandbox.opt("slide")); syncHeight (sandbox.opt("height")); syncWidth (sandbox.opt("width")); load(sandbox.value()); } function onSlideChanged (o) { syncSlide(o.value, o.old); } function load (slides) { if (!slides) return; var state = { success: 0, error: 0, abort: 0, total: slides.length, sum: null }; var handle = function (e, i, img, id) { if(id !== loading) return; // if slides has changed since, don't trigger events anymore state = $.extend({ sum: state.success + state.error + state.abort }, state) if(e) { ++state[e]; ++state.sum; } if(i==sandbox.opt("slide")) sandbox.trigger("currentSlideLoaded", { id: id, img: img, state: state }); if(state.success==1) sandbox.trigger("firstSlideLoaded", { id: id, i: i, img: img, state: state }); if(state.sum==slides.length) { sandbox.trigger("imagesLoaded", { state: state, id: id, images: images }); loading = false; } else sandbox.trigger("imagesLoading", { state: state, id: id }); } var id = loading = $.uuid(); images = $.map(slides, function (slide, i){ var img = new Image(); $.on(img, "load", function () { handle("success", i, img, id) }); $.on(img, "error", function () { handle("error", i, img, id) }); $.on(img, "abort", function () { handle("abort", i, img, id) }); img.src = slide.image; return img; }); } return { def: [], init: function () { sandbox.template.add(".sliderjs", template, onTemplated, 10); sandbox. on("heightChanged", onHeightChanged). on("widthChanged", onWidthChanged). on("slideChanged", onSlideChanged); }, destroy: function () { sandbox.template.remove(template); sandbox. off("heightChanged", onHeightChanged). off("widthChanged", onWidthChanged). off("slideChanged", onSlideChanged); }, change: function (value, old) { sandbox.template.refresh(template); load(value); } } });