From f8cc762515a55cdb1d83e9701e3e28bb000a64df Mon Sep 17 00:00:00 2001 From: Gwen Date: Thu, 23 Jul 2015 21:13:56 +0200 Subject: [PATCH] fix long tapped input not focusing + floating input cursor on scroll --- components/ionKeyboard/ionFocus.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/components/ionKeyboard/ionFocus.js b/components/ionKeyboard/ionFocus.js index f4bad11..c5ba15d 100644 --- a/components/ionKeyboard/ionFocus.js +++ b/components/ionKeyboard/ionFocus.js @@ -1,41 +1,45 @@ Meteor.startup(function() { if (Meteor.isCordova) { + var getScrollContainer = function($element) { + return $($element.parents('.content.overflow-scroll').get(0)); + } + // Scroll to make input on top of the page // #TODO Correct behavior should be: if the input is behind the keyboard, scroll to make it visible on top of the keyboard var scrollToFocusedElement = function($focused) { $focused = $focused || $(':focus'); - var $container = $($focused.parents('.content.overflow-scroll').get(0)); + var $container = getScrollContainer($focused); if (!$focused.length || !$container.length) return; var contentOffset = $container.offset().top; var padding = 10; var scrollTo = $container.scrollTop() + $focused.offset().top - contentOffset - padding; setTimeout(function() { $container.animate({ scrollTop: scrollTo }, 400, function() { - // #TODO fix floating input cursor bug (https://github.com/twbs/bootstrap/issues/14708, https://github.com/cubiq/iscroll/issues/178) + // Fix floating input cursor bug (https://github.com/twbs/bootstrap/issues/14708, https://github.com/cubiq/iscroll/issues/178) var display = $focused.css('display'); $focused.css({ display: 'none' }).css({ display: display }); }); - // $container.scrollTop(scrollTo); }, 0); } - var scrollPosStart, scrollPosEnd, scrollDistance, scrollHappened, scrollThreshold = 10; + var $scrollContainer, scrollPosStart, scrollPosEnd, scrollDistance, scrollHappened, scrollThreshold = 10; - // Fix for input not getting focused on long touch (more than a few ms) + // Trigger focus on input through touchend for long taps $(document).on('touchstart', function(event) { - scrollPosStart = $('.content.overflow-scroll').scrollTop(); + $scrollContainer = getScrollContainer($(event.target)); + scrollPosStart = $scrollContainer.scrollTop(); }); $(document).on('touchend', function(event) { - scrollPosEnd = $('.content.overflow-scroll').scrollTop(); + $scrollContainer = getScrollContainer($(event.target)); + scrollPosEnd = $scrollContainer.scrollTop(); scrollDistance = Math.abs(scrollPosStart - scrollPosEnd); scrollHappened = scrollDistance > scrollThreshold; var $target = $(event.target); var isInput = _.contains(['INPUT', 'TEXTAREA'], event.target.tagName); var isFocused = $target.is(':focus'); - if (!isInput || isFocused || scrollHappened) return; - $target.focus(); + if (isInput && !isFocused && !scrollHappened) $target.focus(); }); $(document).delegate('input, textarea', 'focus', function(event) {