(function($, ns) { var initializePresenters = function(target) { var $target = $(target); var $els = $target.find('[data-presents]').add($target.filter('[data-presents]')); $els.each(function() { var $el = $(this); var presenters = $el.data('presents').split(' '); $.each(presenters, function() { var presenter = this; $el.trigger(presenter + ':present'); }); }); }; var observerStrategies = { mutationObserver: function() { var observer = new MutationObserver(function(mutations) { mutations.map(function(mutation) { var nodes = $.makeArray(mutation.addedNodes); return nodes; }).forEach(function(node) { initializePresenters(node); }); }); var body = document.querySelector('body'); observer.observe(body, { childList: true, subtree: true }); }, mutationEvent: function() { $('body').on('DOMNodeInserted', function(event) { initializePresenters(event.target); }); } }; var observeNewNodes = function() { var observerStrategy; if (typeof MutationObserver !== 'undefined') { observerStrategy = observerStrategies.mutationObserver; } else { observerStrategy = observerStrategies.mutationEvent; } observerStrategy(); }; var present = function(){ observeNewNodes(); initializePresenters($('body')); }; ns.present = present; })(jQuery, undercase);