浏览代码

add 'slidechange' event that can prevent navigation #3003

Hakim El Hattab 3 年之前
父节点
当前提交
ad50dd513f
共有 4 个文件被更改,包括 43 次插入3 次删除
  1. 0 0
      dist/reveal.esm.js
  2. 0 0
      dist/reveal.js
  3. 18 3
      js/reveal.js
  4. 25 0
      test/test.html

文件差异内容过多而无法显示
+ 0 - 0
dist/reveal.esm.js


文件差异内容过多而无法显示
+ 0 - 0
dist/reveal.js


+ 18 - 3
js/reveal.js

@@ -618,6 +618,8 @@ export default function( revealElement, options ) {
 			dispatchPostMessage( type );
 		}
 
+		return event;
+
 	}
 
 	/**
@@ -1192,9 +1194,22 @@ export default function( revealElement, options ) {
 	 * @param {number} [v=indexv] Vertical index of the target slide
 	 * @param {number} [f] Index of a fragment within the
 	 * target slide to activate
-	 * @param {number} [o] Origin for use in multimaster environments
+	 * @param {number} [origin] Origin for use in multimaster environments
 	 */
-	function slide( h, v, f, o ) {
+	function slide( h, v, f, origin ) {
+
+		// Dispatch an event before hte slide
+		const slidechange = dispatchEvent({
+			type: 'slidechange',
+			data: {
+				indexh: h === undefined ? indexh : h,
+				indexv: v === undefined ? indexv : v,
+				origin
+			}
+		});
+
+		// Abort if this slide change was prevented by an event listener
+		if( slidechange.defaultPrevented ) return;
 
 		// Remember where we were at before
 		previousSlide = currentSlide;
@@ -1330,7 +1345,7 @@ export default function( revealElement, options ) {
 					indexv,
 					previousSlide,
 					currentSlide,
-					origin: o
+					origin
 				}
 			});
 		}

+ 25 - 0
test/test.html

@@ -781,6 +781,31 @@
 
 				QUnit.module( 'Events' );
 
+				QUnit.test( 'slidechange', function( assert ) {
+					var done = assert.async( 2 );
+
+					var normalEvent = function( event ) {
+						assert.ok( true, 'event fired' );
+						done();
+					}
+					var blockingEvent = function( event ) {
+						event.preventDefault();
+						assert.ok( true, 'event fired' );
+						done();
+					}
+
+					Reveal.on( 'slidechange', normalEvent );
+					Reveal.slide( 2, 0 );
+					Reveal.off( 'slidechange', normalEvent );
+
+					Reveal.on( 'slidechange', blockingEvent );
+					Reveal.slide( 3, 0 );
+					Reveal.off( 'slidechange', blockingEvent );
+
+					assert.strictEqual( Reveal.getIndices().h, 2, 'preventing "slidechange" blocks navigation ' );
+
+				});
+
 				QUnit.test( 'slidechanged', function( assert ) {
 					assert.expect( 3 );
 					var done = assert.async( 3 );

部分文件因为文件数量过多而无法显示