单击空白区域

时间:2017-01-17 10:37:34

标签: ios cordova ionic-framework safari uiwebview

我使用Ionic 1.3.2构建的应用程序出现了一个奇怪的问题,仅在iOS上发生。

当我点击textarea输入时,键盘照常打开,此部分按预期工作,input元素获得焦点。

然而,当我点击任何输入之外的屏幕的某些区域,比如我所拥有的文本字段下方20px时,如果键盘已经打开但键盘要么关闭要么关闭并立即重新打开但是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插件的问题,因为即使我删除它也会发生同样的事情。

编辑(如何重现):

以下是您可以用来重现此问题的sample project(KeyboardBugRepro.zip)。解压缩归档后,您需要执行以下操作才能运行它:

  1. 安装Node.js.如果您正在使用Hombrew运行brew install node
  2. 使用npm:npm install -g ionic cordova
  3. 全局安装Ionic和Cordova
  4. 如果可能需要运行"离子准备"在运行项目之前,您可以先跳到下一步,看看它是否有效。
  5. 运行ionic emulate ios。这将启动iPhone SE模拟器并启动应用程序。
  6. 确保您在模拟器选项中禁用了硬件键盘(硬件 - >键盘>取消选中连接硬件键盘)。
  7. 当应用程序启动时,您将看到登录屏幕。现在单击密码输入稍下方的某处,观察软件键盘如何打开但输入没有聚焦。但是,如果你直接点击输入,它会得到集中。单击空白区域将关闭键盘。

    要重现崩溃只是连续多次连续执行相同的操作,通常只需2-3次点击。

    要从Xcode运行项目,只需在<project>/platforms/ios/KeyboardBug.xcodeproj中打开由ionic生成的项目,然后点击Run。

2 个答案:

答案 0 :(得分:3)

要移除键盘,您需要失去对输入的关注。

document.activeElement.blur();

使用此行删除焦点,键盘消失。

在您的情况下,可以在您的身上添加事件,并在您点击输入时再次停止打开键盘。

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

答案 1 :(得分:2)

删除所有eventListeners并检查。我认为其中一个地方有一些碰撞,这会激活&#34;错误&#34;。