Skip to content

Commit f7db8c3

Browse files
committed
feat(keyboard): easily disable/re-enable keyboard
Closes #2285.
1 parent 464223c commit f7db8c3

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

Diff for: js/utils/keyboard.js

+53-3
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ var KEYBOARD_OPEN_CSS = 'keyboard-open';
117117
*/
118118
var SCROLL_CONTAINER_CSS = 'scroll-content';
119119

120+
/**
121+
* Debounced keyboardFocusIn function
122+
*/
123+
var debouncedKeyboardFocusIn = ionic.debounce(keyboardFocusIn, 200, true);
124+
125+
/**
126+
* Debounced keyboardNativeShow function
127+
*/
128+
var debouncedKeyboardNativeShow = ionic.debounce(keyboardNativeShow, 100, true);
129+
120130
/**
121131
* Ionic keyboard namespace.
122132
* @namespace keyboard
@@ -150,6 +160,11 @@ ionic.keyboard = {
150160
*/
151161
isLandscape: false,
152162

163+
/**
164+
* Whether the keyboard event listeners have been added or not
165+
*/
166+
isInitialized: false,
167+
153168
/**
154169
* Hide the keyboard, if it is open.
155170
*/
@@ -168,6 +183,38 @@ ionic.keyboard = {
168183
if (keyboardHasPlugin()) {
169184
cordova.plugins.Keyboard.show();
170185
}
186+
},
187+
188+
/**
189+
* Remove all keyboard related event listeners, effectively disabling Ionic's
190+
* keyboard adjustments.
191+
*/
192+
disable: function() {
193+
if (keyboardHasPlugin()) {
194+
window.removeEventListener('native.keyboardshow', debouncedKeyboardNativeShow );
195+
window.removeEventListener('native.keyboardhide', keyboardFocusOut);
196+
} else {
197+
document.body.removeEventListener('focusout', keyboardFocusOut);
198+
}
199+
200+
document.body.removeEventListener('ionic.focusin', debouncedKeyboardFocusIn);
201+
document.body.removeEventListener('focusin', debouncedKeyboardFocusIn);
202+
203+
window.removeEventListener('orientationchange', keyboardOrientationChange);
204+
205+
if ( window.navigator.msPointerEnabled ) {
206+
document.removeEventListener("MSPointerDown", keyboardInit);
207+
} else {
208+
document.removeEventListener('touchstart', keyboardInit);
209+
}
210+
ionic.keyboard.isInitialized = false;
211+
},
212+
213+
/**
214+
* Alias for keyboardInit, initialize all keyboard related event listeners.
215+
*/
216+
enable: function() {
217+
keyboardInit();
171218
}
172219
};
173220

@@ -181,13 +228,14 @@ keyboardCurrentViewportHeight = getViewportHeight();
181228

182229
/**
183230
* Event handler for first touch event, initializes all event listeners
184-
* for keyboard related events.
231+
* for keyboard related events. Also aliased by ionic.keyboard.enable.
185232
*/
186233
function keyboardInit() {
187-
var debouncedKeyboardFocusIn = ionic.debounce(keyboardFocusIn, 200, true);
234+
235+
if (ionic.keyboard.isInitialized) return;
188236

189237
if (keyboardHasPlugin()) {
190-
window.addEventListener('native.keyboardshow', ionic.debounce(keyboardNativeShow, 100, true));
238+
window.addEventListener('native.keyboardshow', debouncedKeyboardNativeShow);
191239
window.addEventListener('native.keyboardhide', keyboardFocusOut);
192240
} else {
193241
document.body.addEventListener('focusout', keyboardFocusOut);
@@ -201,6 +249,8 @@ function keyboardInit() {
201249
} else {
202250
document.removeEventListener('touchstart', keyboardInit);
203251
}
252+
253+
ionic.keyboard.isInitialized = true;
204254
}
205255

206256
/**

Diff for: test/unit/utils/keyboard.unit.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -502,5 +502,17 @@ describe('Ionic Keyboard', function() {
502502

503503
ionic.Platform.isFullScreen = true;
504504
expect(getViewportHeight()).toBe(268);
505-
})
505+
});
506+
507+
it('enable() should set isInitialized to true', function(){
508+
expect(ionic.keyboard.isInitialized).toBe(false);
509+
ionic.keyboard.enable();
510+
expect(ionic.keyboard.isInitialized).toBe(true);
511+
});
512+
513+
it('disable() should set isInitialized to false', function(){
514+
expect(ionic.keyboard.isInitialized).toBe(true);
515+
ionic.keyboard.disable();
516+
expect(ionic.keyboard.isInitialized).toBe(false);
517+
});
506518
});

0 commit comments

Comments
 (0)