diff --git a/js/utils/keyboard.js b/js/utils/keyboard.js index f2b538e5236..1ec7ae75913 100644 --- a/js/utils/keyboard.js +++ b/js/utils/keyboard.js @@ -117,6 +117,16 @@ var KEYBOARD_OPEN_CSS = 'keyboard-open'; */ var SCROLL_CONTAINER_CSS = 'scroll-content'; +/** + * Debounced keyboardFocusIn function + */ +var debouncedKeyboardFocusIn = ionic.debounce(keyboardFocusIn, 200, true); + +/** + * Debounced keyboardNativeShow function + */ +var debouncedKeyboardNativeShow = ionic.debounce(keyboardNativeShow, 100, true); + /** * Ionic keyboard namespace. * @namespace keyboard @@ -150,6 +160,11 @@ ionic.keyboard = { */ isLandscape: false, + /** + * Whether the keyboard event listeners have been added or not + */ + isInitialized: false, + /** * Hide the keyboard, if it is open. */ @@ -168,6 +183,38 @@ ionic.keyboard = { if (keyboardHasPlugin()) { cordova.plugins.Keyboard.show(); } + }, + + /** + * Remove all keyboard related event listeners, effectively disabling Ionic's + * keyboard adjustments. + */ + disable: function() { + if (keyboardHasPlugin()) { + window.removeEventListener('native.keyboardshow', debouncedKeyboardNativeShow ); + window.removeEventListener('native.keyboardhide', keyboardFocusOut); + } else { + document.body.removeEventListener('focusout', keyboardFocusOut); + } + + document.body.removeEventListener('ionic.focusin', debouncedKeyboardFocusIn); + document.body.removeEventListener('focusin', debouncedKeyboardFocusIn); + + window.removeEventListener('orientationchange', keyboardOrientationChange); + + if ( window.navigator.msPointerEnabled ) { + document.removeEventListener("MSPointerDown", keyboardInit); + } else { + document.removeEventListener('touchstart', keyboardInit); + } + ionic.keyboard.isInitialized = false; + }, + + /** + * Alias for keyboardInit, initialize all keyboard related event listeners. + */ + enable: function() { + keyboardInit(); } }; @@ -181,13 +228,14 @@ keyboardCurrentViewportHeight = getViewportHeight(); /** * Event handler for first touch event, initializes all event listeners - * for keyboard related events. + * for keyboard related events. Also aliased by ionic.keyboard.enable. */ function keyboardInit() { - var debouncedKeyboardFocusIn = ionic.debounce(keyboardFocusIn, 200, true); + + if (ionic.keyboard.isInitialized) return; if (keyboardHasPlugin()) { - window.addEventListener('native.keyboardshow', ionic.debounce(keyboardNativeShow, 100, true)); + window.addEventListener('native.keyboardshow', debouncedKeyboardNativeShow); window.addEventListener('native.keyboardhide', keyboardFocusOut); } else { document.body.addEventListener('focusout', keyboardFocusOut); @@ -201,6 +249,8 @@ function keyboardInit() { } else { document.removeEventListener('touchstart', keyboardInit); } + + ionic.keyboard.isInitialized = true; } /** diff --git a/test/unit/utils/keyboard.unit.js b/test/unit/utils/keyboard.unit.js index 483ff0e296d..c0696419ba3 100644 --- a/test/unit/utils/keyboard.unit.js +++ b/test/unit/utils/keyboard.unit.js @@ -502,5 +502,17 @@ describe('Ionic Keyboard', function() { ionic.Platform.isFullScreen = true; expect(getViewportHeight()).toBe(268); - }) + }); + + it('enable() should set isInitialized to true', function(){ + expect(ionic.keyboard.isInitialized).toBe(false); + ionic.keyboard.enable(); + expect(ionic.keyboard.isInitialized).toBe(true); + }); + + it('disable() should set isInitialized to false', function(){ + expect(ionic.keyboard.isInitialized).toBe(true); + ionic.keyboard.disable(); + expect(ionic.keyboard.isInitialized).toBe(false); + }); });