Переглянути джерело

adds new api methods (getCurrentSlide, getPreviousSlide, getIndices) closes #73

Hakim El Hattab 12 роки тому
батько
коміт
e570265a67
3 змінених файлів з 59 додано та 24 видалено
  1. 11 2
      README.md
  2. 1 0
      css/main.css
  3. 47 22
      js/reveal.js

+ 11 - 2
README.md

@@ -65,9 +65,10 @@ Reveal.initialize({
 
 ### API
 
-The Reveal class provides a minimal JavaScript API for controlling its navigation:
+The Reveal class provides a minimal JavaScript API for controlling navigation and reading state:
 
 ```javascript
+// Navigation
 Reveal.navigateTo( indexh, indexv );
 Reveal.navigateLeft();
 Reveal.navigateRight();
@@ -76,6 +77,12 @@ Reveal.navigateDown();
 Reveal.navigatePrev();
 Reveal.navigateNext();
 Reveal.toggleOverview();
+
+// Retrieves the previous and current slide elements
+Reveal.getPreviousSlide();
+Reveal.getCurrentSlide();
+
+Reveal.getIndices(); // { h: 0, v: 0 } }
 ```
 
 ### States
@@ -172,7 +179,9 @@ You can change the appearance of the speaker notes by editing the file at `plugi
 ## History
 
 #### 1.5 (master/beta)
-- TBD
+- New API method ```Reveal.getPreviousSlide()```
+- New API method ```Reveal.getCurrentSlide()```
+- New API method ```Reveal.getIndices()```
 
 #### 1.4
 - Main ```#reveal container``` is now selected via a class instead of ID

+ 1 - 0
css/main.css

@@ -1005,6 +1005,7 @@ body {
 	background: rgba( 0, 0, 0, 0.6 );
 }
 
+
 /*********************************************
  * SPEAKER NOTES
  *********************************************/

+ 47 - 22
js/reveal.js

@@ -1,5 +1,5 @@
 /*!
- * reveal.js 1.5 r1
+ * reveal.js 1.5 r2
  * http://lab.hakim.se/reveal-js
  * MIT licensed
  * 
@@ -12,10 +12,6 @@ var Reveal = (function(){
 
 		IS_TOUCH_DEVICE = !!( 'ontouchstart' in window ),
 
-		// The horizontal and verical index of the currently active slide
-		indexh = 0,
-		indexv = 0,
-
 		// Configurations defaults, can be overridden at initialization time 
 		config = {
 			// Display controls in the bottom right corner
@@ -50,6 +46,14 @@ var Reveal = (function(){
 			transition: 'default' // default/cube/page/concave/linear(2d)
 		},
 
+		// The horizontal and verical index of the currently active slide
+		indexh = 0,
+		indexv = 0,
+
+		// The previous and current slide HTML elements
+		previousSlide,
+		currentSlide,
+
 		// Slides may hold a data-state attribute which we pick up and apply 
 		// as a class to the body. This list contains the combined state of 
 		// all current slides.
@@ -650,6 +654,9 @@ var Reveal = (function(){
 	 * set indices. 
 	 */
 	function slide( h, v ) {
+		// Remember where we were at before
+		previousSlide = currentSlide;
+
 		// Remember the state before this slide
 		var stateBefore = state.concat();
 
@@ -700,31 +707,30 @@ var Reveal = (function(){
 		clearTimeout( writeURLTimeout );
 		writeURLTimeout = setTimeout( writeURL, 1500 );
 
-		// Only fire if the slide index is different from before
-		if( indexh !== indexhBefore || indexv !== indexvBefore ) {
-			// Query all horizontal slides in the deck
-			var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
+		// Query all horizontal slides in the deck
+		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
 
-			// Find the previous and current horizontal slides
-			var previousHorizontalSlide = horizontalSlides[ indexhBefore ],
-				currentHorizontalSlide = horizontalSlides[ indexh ];
+		// Find the current horizontal slide and any possible vertical slides
+		// within it
+		var currentHorizontalSlide = horizontalSlides[ indexh ],
+			currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );
 
-			// Query all vertical slides inside of the previous and current horizontal slides
-			var previousVerticalSlides = previousHorizontalSlide.querySelectorAll( 'section' );
-				currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );
+		// Store references to the previous and current slides
+		currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;
 
-			// Dispatch an event notifying observers of the change in slide
+		// Dispatch an event if the slide changed
+		if( indexh !== indexhBefore || indexv !== indexvBefore ) {
 			dispatchEvent( 'slidechanged', {
-				// Include the current indices in the event
 				'indexh': indexh, 
 				'indexv': indexv,
-
-				// Passes direct references to the slide HTML elements, attempts to find
-				// a vertical slide and falls back on the horizontal parent
-				'previousSlide': previousVerticalSlides[ indexvBefore ] || previousHorizontalSlide,
-				'currentSlide': currentVerticalSlides[ indexv ] || currentHorizontalSlide
+				'previousSlide': previousSlide,
+				'currentSlide': currentSlide
 			} );
 		}
+		else {
+			// Ensure that the previous slide is never the same as the current
+			previousSlide = null;
+		}
 	}
 
 	/**
@@ -980,9 +986,28 @@ var Reveal = (function(){
 		navigateNext: navigateNext,
 		toggleOverview: toggleOverview,
 
+		// Adds or removes all internal event listeners (such as keyboard)
 		addEventListeners: addEventListeners,
 		removeEventListeners: removeEventListeners,
 
+		// Returns the indices of the current slide
+		getIndices: function() {
+			return { 
+				h: indexh, 
+				v: indexv 
+			};
+		},
+
+		// Returns the previous slide element, may be null
+		getPreviousSlide: function() {
+			return previousSlide
+		},
+
+		// Returns the current slide element
+		getCurrentSlide: function() {
+			return currentSlide
+		},
+
 		// Forward event binding to the reveal DOM element
 		addEventListener: function( type, listener, useCapture ) {
 			( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture );