From 49e8e0d205dad7ad60d3eb060787a67b197ba1d1 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sat, 11 Aug 2012 20:25:55 -0400 Subject: rewrote initialization code for clarity and brevity (#105) --- js/reveal.js | 107 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 24 deletions(-) (limited to 'js/reveal.js') diff --git a/js/reveal.js b/js/reveal.js index 1e942f2..3980416 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -1,5 +1,5 @@ /*! - * reveal.js 2.0 r17 + * reveal.js 2.0 r18 * http://lab.hakim.se/reveal-js * MIT licensed * @@ -40,7 +40,10 @@ var Reveal = (function(){ rollingLinks: true, // Transition style - transition: 'default' // default/cube/page/concave/linear(2d) + transition: 'default', // default/cube/page/concave/linear(2d), + + // Script dependencies to load + dependencies: [] }, // The horizontal and verical index of the currently active slide @@ -71,9 +74,6 @@ var Reveal = (function(){ 'msTransform' in document.body.style || 'OTransform' in document.body.style || 'transform' in document.body.style, - - // Detect support for elem.classList - supportsClassList = !!document.body.classList; // Throttles mouse wheel navigation mouseWheelTimeout = 0, @@ -96,12 +96,10 @@ var Reveal = (function(){ /** - * Starts up the slideshow by applying configuration - * options and binding various events. + * Starts up the presentation if the client is capable. */ function initialize( options ) { - - if( ( !supports2DTransforms && !supports3DTransforms ) || !supportsClassList ) { + if( ( !supports2DTransforms && !supports3DTransforms ) ) { document.body.setAttribute( 'class', 'no-transforms' ); // If the browser doesn't support core features we won't be @@ -109,11 +107,14 @@ var Reveal = (function(){ return; } + // Copy options over to our config object + extend( config, options ); + // Cache references to DOM elements dom.wrapper = document.querySelector( '.reveal' ); dom.progress = document.querySelector( '.reveal .progress' ); dom.progressbar = document.querySelector( '.reveal .progress span' ); - + if ( config.controls ) { dom.controls = document.querySelector( '.reveal .controls' ); dom.controlsLeft = document.querySelector( '.reveal .controls .left' ); @@ -121,21 +122,9 @@ var Reveal = (function(){ dom.controlsUp = document.querySelector( '.reveal .controls .up' ); dom.controlsDown = document.querySelector( '.reveal .controls .down' ); } - - // Copy options over to our config object - extend( config, options ); - - // Subscribe to input - addEventListeners(); - - // Updates the presentation to match the current configuration values - configure(); - - // Read the initial hash - readURL(); - // Start auto-sliding if it's enabled - cueAutoSlide(); + // Loads the dependencies and continues to #start() once done + load(); // Set up hiding of the browser address bar if( navigator.userAgent.match( /(iphone|ipod|android)/i ) ) { @@ -150,6 +139,76 @@ var Reveal = (function(){ } + /** + * Loads the dependencies of reveal.js. Dependencies are + * defined via the configuration option 'dependencies' + * and will be loaded prior to starting/binding reveal.js. + * Some dependencies may have an 'async' flag, if so they + * will load after reveal.js has been started up. + */ + function load() { + var scripts = [], + scriptsAsync = []; + + for( var i = 0, len = config.dependencies.length; i < len; i++ ) { + var s = config.dependencies[i]; + + // Load if there's no condition or the condition is truthy + if( !s.condition || s.condition() ) { + if( s.async ) { + scriptsAsync.push( s.src ); + } + else { + scripts.push( s.src ); + } + + // Extension may contain callback functions + if( typeof s.callback === 'function' ) { + head.ready( s.src.match( /([\w\d_-]*)\.?[^\\\/]*$/i )[0], s.callback ); + } + } + } + + // Called once synchronous scritps finish loading + function proceed() { + // Load asynchronous scripts + head.js.apply( null, scriptsAsync ); + + start(); + } + + if( scripts.length ) { + head.ready( proceed ); + + // Load synchronous scripts + head.js.apply( null, scripts ); + } + else { + proceed(); + } + } + + /** + * Starts up reveal.js by binding input events and navigating + * to the current URL deeplink if there is one. + */ + function start() { + // Subscribe to input + addEventListeners(); + + // Updates the presentation to match the current configuration values + configure(); + + // Read the initial hash + readURL(); + + // Start auto-sliding if it's enabled + cueAutoSlide(); + } + + /** + * Applies the configuration settings from the config object. + */ function configure() { if( supports3DTransforms === false ) { config.transition = 'linear'; -- cgit v1.2.3