Skip to content

Commit 4b5fe0f

Browse files
author
Henrik Ingo
committed
Set stopPropagation() event handlers for text input fields
Fixes impress#525 impress#140
1 parent 8b14eda commit 4b5fe0f

File tree

5 files changed

+74
-40
lines changed

5 files changed

+74
-40
lines changed

js/impress.js

+37-20
Original file line numberDiff line numberDiff line change
@@ -1497,22 +1497,18 @@
14971497
var gc = api.lib.gc;
14981498

14991499
gc.addEventListener( document, "keydown", function( event ) {
1500-
if ( event.ctrlKey && event.keyCode === 66 ) {
1500+
if ( event.keyCode === 66 ) {
15011501
event.preventDefault();
15021502
if ( !blackedOut ) {
15031503
blackout();
15041504
} else {
1505-
1506-
// Note: This doesn't work on Firefox. It will set display:block,
1507-
// but slides only become visible again upon next transition, which
1508-
// forces some kind of redraw. Works as intended on Chrome.
15091505
removeBlackout();
15101506
}
15111507
}
15121508
}, false );
15131509

15141510
gc.addEventListener( document, "keyup", function( event ) {
1515-
if ( event.ctrlKey && event.keyCode === 66 ) {
1511+
if ( event.keyCode === 66 ) {
15161512
event.preventDefault();
15171513
}
15181514
}, false );
@@ -1601,7 +1597,12 @@
16011597
*
16021598
* Functionality to better support use of input, textarea, button... elements in a presentation.
16031599
*
1604-
* Currently this does only one single thing: On impress:stepleave, de-focus any potentially active
1600+
* This plugin does two things:
1601+
*
1602+
* Set stopPropagagation on any element that might take text input. This allows users to type, for
1603+
* example, the letter 'P' into a form field, without causing the presenter console to spring up.
1604+
*
1605+
* On impress:stepleave, de-focus any potentially active
16051606
* element. This is to prevent the focus from being left in a form element that is no longer visible
16061607
* in the window, and user therefore typing garbage into the form.
16071608
*
@@ -1617,6 +1618,32 @@
16171618
/* global document */
16181619
( function( document ) {
16191620
"use strict";
1621+
var root;
1622+
var api;
1623+
1624+
document.addEventListener( "impress:init", function(event) {
1625+
root = event.target;
1626+
api = event.detail.api;
1627+
var gc = api.lib.gc;
1628+
1629+
var selectors = ["input[type=text]", "textarea", "select", "[contenteditable=true]"];
1630+
for ( var selector of selectors ) {
1631+
var elements = document.querySelectorAll(selector);
1632+
if ( ! elements ) {
1633+
continue;
1634+
}
1635+
1636+
for ( var i = 0; i < elements.length; i++) {
1637+
var e = elements[i];
1638+
gc.addEventListener( e, "keydown", function( event ) {
1639+
event.stopPropagation();
1640+
} );
1641+
gc.addEventListener( e, "keyup", function( event ) {
1642+
event.stopPropagation();
1643+
} );
1644+
}
1645+
}
1646+
}, false );
16201647

16211648
document.addEventListener( "impress:stepleave", function() {
16221649
document.activeElement.blur();
@@ -1864,12 +1891,9 @@
18641891

18651892
document.addEventListener( "keyup", function( event ) {
18661893

1867-
// Check that event target is html or body element.
1868-
if ( event.target.nodeName === "BODY" || event.target.nodeName === "HTML" ) {
1869-
if ( event.keyCode === 72 ) { // "h"
1870-
event.preventDefault();
1871-
toggleHelp();
1872-
}
1894+
if ( event.keyCode === 72 ) { // "h"
1895+
event.preventDefault();
1896+
toggleHelp();
18731897
}
18741898
}, false );
18751899

@@ -2907,13 +2931,6 @@
29072931
return false;
29082932
}
29092933

2910-
// For arrows, etc, check that event target is html or body element. This is to allow
2911-
// presentations to have, for example, forms with input elements where user can type
2912-
// text, including space, and not move to next step.
2913-
if ( event.target.nodeName !== "BODY" && event.target.nodeName !== "HTML" ) {
2914-
return false;
2915-
}
2916-
29172934
if ( ( event.keyCode >= 32 && event.keyCode <= 34 ) ||
29182935
( event.keyCode >= 37 && event.keyCode <= 40 ) ) {
29192936
return true;

src/plugins/blackout/blackout.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -84,22 +84,18 @@
8484
var gc = api.lib.gc;
8585

8686
gc.addEventListener( document, "keydown", function( event ) {
87-
if ( event.ctrlKey && event.keyCode === 66 ) {
87+
if ( event.keyCode === 66 ) {
8888
event.preventDefault();
8989
if ( !blackedOut ) {
9090
blackout();
9191
} else {
92-
93-
// Note: This doesn't work on Firefox. It will set display:block,
94-
// but slides only become visible again upon next transition, which
95-
// forces some kind of redraw. Works as intended on Chrome.
9692
removeBlackout();
9793
}
9894
}
9995
}, false );
10096

10197
gc.addEventListener( document, "keyup", function( event ) {
102-
if ( event.ctrlKey && event.keyCode === 66 ) {
98+
if ( event.keyCode === 66 ) {
10399
event.preventDefault();
104100
}
105101
}, false );

src/plugins/form/form.js

+32-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
*
44
* Functionality to better support use of input, textarea, button... elements in a presentation.
55
*
6-
* Currently this does only one single thing: On impress:stepleave, de-focus any potentially active
6+
* This plugin does two things:
7+
*
8+
* Set stopPropagagation on any element that might take text input. This allows users to type, for
9+
* example, the letter 'P' into a form field, without causing the presenter console to spring up.
10+
*
11+
* On impress:stepleave, de-focus any potentially active
712
* element. This is to prevent the focus from being left in a form element that is no longer visible
813
* in the window, and user therefore typing garbage into the form.
914
*
@@ -19,6 +24,32 @@
1924
/* global document */
2025
( function( document ) {
2126
"use strict";
27+
var root;
28+
var api;
29+
30+
document.addEventListener( "impress:init", function( event ) {
31+
root = event.target;
32+
api = event.detail.api;
33+
var gc = api.lib.gc;
34+
35+
var selectors = [ "input[type=text]", "textarea", "select", "[contenteditable=true]" ];
36+
for ( var selector of selectors ) {
37+
var elements = document.querySelectorAll( selector );
38+
if ( !elements ) {
39+
continue;
40+
}
41+
42+
for ( var i = 0; i < elements.length; i++ ) {
43+
var e = elements[ i ];
44+
gc.addEventListener( e, "keydown", function( event ) {
45+
event.stopPropagation();
46+
} );
47+
gc.addEventListener( e, "keyup", function( event ) {
48+
event.stopPropagation();
49+
} );
50+
}
51+
}
52+
}, false );
2253

2354
document.addEventListener( "impress:stepleave", function() {
2455
document.activeElement.blur();

src/plugins/help/help.js

+3-6
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,9 @@
5858

5959
document.addEventListener( "keyup", function( event ) {
6060

61-
// Check that event target is html or body element.
62-
if ( event.target.nodeName === "BODY" || event.target.nodeName === "HTML" ) {
63-
if ( event.keyCode === 72 ) { // "h"
64-
event.preventDefault();
65-
toggleHelp();
66-
}
61+
if ( event.keyCode === 72 ) { // "h"
62+
event.preventDefault();
63+
toggleHelp();
6764
}
6865
}, false );
6966

src/plugins/navigation/navigation.js

-7
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,6 @@
6767
return false;
6868
}
6969

70-
// For arrows, etc, check that event target is html or body element. This is to allow
71-
// presentations to have, for example, forms with input elements where user can type
72-
// text, including space, and not move to next step.
73-
if ( event.target.nodeName !== "BODY" && event.target.nodeName !== "HTML" ) {
74-
return false;
75-
}
76-
7770
if ( ( event.keyCode >= 32 && event.keyCode <= 34 ) ||
7871
( event.keyCode >= 37 && event.keyCode <= 40 ) ) {
7972
return true;

0 commit comments

Comments
 (0)