Клавиатура открывается после нажатия на пустое место

У меня странная проблема с моим приложением, созданным с помощью Ionic 1.3.2, которое происходит только на iOS.

Когда я нажимаю на вход в textarea, клавиатура открывается, как обычно, эта часть работает так, как ожидалось, и элемент input получает фокус.

Однако, когда я нажимаю на определенные области экрана вне любых входов, например 20px ниже текстового поля, которое у меня есть, клавиатура либо opsn, либо закрывается и снова открывается сразу, если она уже открыта, но input не получает фокуса, а document.activeElement возвращает элемент body (проверяется в инспекторе Safari).

Итак, в этом режиме я могу напечатать все, что захочу, но введенный текст не появляется нигде, как если бы я печатал в никуда (что немного странно).

Кроме того, если я нажимаю 2-3 раза в одном из этих мест, все приложение падает с EXC_BAD_ACCESS внутри некоторых UIWebView внутренних элементов:

* thread #1: tid = 0x35ea78, 0x000000010c2c3acb libobjc.A.dylib`objc_msgSend + 11, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
  * frame #0: 0x000000010c2c3acb libobjc.A.dylib`objc_msgSend + 11
    frame #1: 0x000000010ec56024 UIKit`-[UITextInteractionAssistant(UITextInteractionAssistant_Internal) swallowsDoubleTapWithScale:atPoint:] + 264
    frame #2: 0x000000010ea4ce75 UIKit`-[UIWebDocumentView shouldSelectionAssistantReceiveDoubleTapAtPoint:forScale:] + 91
    frame #3: 0x000000010f1b930a UIKit`_UIWebDoubleTapAtLocation + 369
    frame #4: 0x000000010ec3d409 UIKit`-[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 57
    frame #5: 0x000000010ec451a8 UIKit`_UIGestureRecognizerSendTargetActions + 109
    frame #6: 0x000000010ec42c77 UIKit`_UIGestureRecognizerSendActions + 227
    frame #7: 0x000000010ec41f03 UIKit`-[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 891
    frame #8: 0x000000010ec2df7e UIKit`_UIGestureEnvironmentUpdate + 1395
    frame #9: 0x000000010ec2d9c3 UIKit`-[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 521
    frame #10: 0x000000010ec2cba6 UIKit`-[UIGestureEnvironment _updateGesturesForEvent:window:] + 286
    frame #11: 0x000000010e772c1d UIKit`-[UIWindow sendEvent:] + 3989
    frame #12: 0x000000010e71f9ab UIKit`-[UIApplication sendEvent:] + 371
    frame #13: 0x000000010ef0c72d UIKit`__dispatchPreprocessedEventFromEventQueue + 3248
    frame #14: 0x000000010ef05463 UIKit`__handleEventQueue + 4879
    frame #15: 0x000000010c819761 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    frame #16: 0x000000010c7fe98c CoreFoundation`__CFRunLoopDoSources0 + 556
    frame #17: 0x000000010c7fde76 CoreFoundation`__CFRunLoopRun + 918
    frame #18: 0x000000010c7fd884 CoreFoundation`CFRunLoopRunSpecific + 420
    frame #19: 0x0000000111fc8a6f GraphicsServices`GSEventRunModal + 161
    frame #20: 0x000000010e701c68 UIKit`UIApplicationMain + 159
    frame #21: 0x000000010aa7bd81 MyApp`main(argc=1, argv=0x00007fff55184680) + 65 at main.m:32
    frame #22: 0x000000010e42f68d libdyld.dylib`start + 1

Кто-нибудь знает, как это исправить?

Я использую Ionic 1.3.2. Это, похоже, не проблема с плагином Ionic Keyboard, потому что то же самое происходит, даже если я удалю его.

Изменить (как воспроизвести):

Вот пример который вы можете использовать для воспроизведения этой проблемы (KeyboardBugRepro.zip). Вам нужно будет сделать следующее, чтобы запустить его после того, как вы извлекли архив:

  • Установите Node.js. Если вы используете Hombrew run brew install node
  • Установите Ион и Кордову глобально с npm: npm install -g ionic cordova
  • Если может потребоваться запустить "ионную подготовку" перед запуском проекта, но сначала вы можете перейти к следующему шагу и посмотреть, работает ли он.
  • Запустите ionic emulate ios. Это запустит симулятор iPhone SE и запустит приложение.
  • Убедитесь, что вы отключили аппаратную клавиатуру в вариантах симулятора (Оборудование → Клавиатурa > снимите флажок "Подключить аппаратную клавиатуру" ).

Когда приложение запустится, вы увидите экран входа в систему. Теперь нажмите немного ниже ввода пароля и наблюдайте, как открывается клавиатура программного обеспечения, но вход не фокусируется. Но если вы нажимаете на вход напрямую, он фокусируется. Нажатие на пустое место закроет клавиатуру.

Воспроизведение аварии просто делает то же самое несколько раз подряд очень быстро, обычно достаточно 2-3 щелчков.

Чтобы запустить проект из Xcode, просто откройте проект, созданный с помощью ионного в <project>/platforms/ios/KeyboardBug.xcodeproj, и нажмите Run.

Ответ 1

Чтобы удалить клавиатуру, вам необходимо потерять фокус на вашем входе.

document.activeElement.blur();

С помощью этой строки вы удалите фокус, и клавиатура исчезнет.

В вашем случае вы можете добавить событие на свое тело и снова прекратить открывать клавиатуру, если вы щелкните по входу.

$(document).ready(function () {
  $('body').click(function () {
    document.activeElement.blur();
  });

Ответ 2

Удалите все eventListeners и проверьте. Я думаю, что в одном из них есть место столкновения, которое активирует "ошибки".