iOS 11.3 WKWebView:input.focus() 没有做任何事情

Posted

技术标签:

【中文标题】iOS 11.3 WKWebView:input.focus() 没有做任何事情【英文标题】:iOS 11.3 WKWebView: input.focus() doesn't do anything 【发布时间】:2018-03-31 12:40:42 【问题描述】:

自从更新到 ios 11.3 后,html 输入字段无法再使用 javascript .focus() 聚焦,除非函数调用紧跟在触摸交互之后(过去可以随时使用 .focus())。有已知的解决方法吗?

【问题讨论】:

【参考方案1】:

向元素添加点击功能以调用焦点功能就可以了。还是有更好的解决方案?

<html>
<head>
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

        <meta charset="UTF-8">
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black">
        <meta name="format-detection" content="telephone=no, email=no">            
</head>
<body>
    <input id="test" type="text" placeholder="test" />
    <input id="test2" type="text" placeholder="test" />

    <script src="https://cdn.bootcss.com/fastclick/1.0.6/fastclick.js"></script>
    <script>
        window.FastClick.attach(document.body);
        document.getElementById('test').onclick = function(e) 
          // works fine
          e.target.focus();
        ;
        document.getElementById('test2').onclick = function(e) 
          // not working
          setTimeout(function() 
            e.target.focus();
          , 50)
        ;
    </script>
</body>
</html>

【讨论】:

你能解释一下你的答案吗 只需添加onclick触发焦点【参考方案2】:

focus()之前调用blur().....

【讨论】:

【参考方案3】:

这是我们目前在应用程序开发框架中使用的代码,用于使 input.focus() 工作。确认在 App Store 中工作并被 Apple 接受:

Class class = NSClassFromString(@"WKContentView");
NSOperatingSystemVersion iOS_11_3_0 = (NSOperatingSystemVersion)11, 3, 0;
NSOperatingSystemVersion iOS_12_2_0 = (NSOperatingSystemVersion)12, 2, 0;
NSOperatingSystemVersion iOS_13_0_0 = (NSOperatingSystemVersion)13, 0, 0;

if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_13_0_0]) 
    SEL selector = sel_getUid("_elementDidFocus:userIsInteracting:blurPreviousNode:activityStateChanges:userObject:");
    Method method = class_getInstanceMethod(class, selector);
    IMP original = method_getImplementation(method);
    IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) 
    ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
    );
    method_setImplementation(method, override);

else if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_12_2_0]) 
    SEL selector = sel_getUid("_elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:");
    Method method = class_getInstanceMethod(class, selector);
    IMP original = method_getImplementation(method);
    IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) 
    ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
    );
    method_setImplementation(method, override);

else if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_11_3_0]) 
    SEL selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:");
    Method method = class_getInstanceMethod(class, selector);
    IMP original = method_getImplementation(method);
    IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) 
        ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
    );
    method_setImplementation(method, override);
 else 
    SEL selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:");
    Method method = class_getInstanceMethod(class, selector);
    IMP original = method_getImplementation(method);
    IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, id arg3) 
        ((void (*)(id, SEL, void*, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3);
    );
    method_setImplementation(method, override);

【讨论】:

您好,七,您能告诉我您在代码库中的确切位置插入了这些行吗?谢谢。 Hello Louis -- 在初始化 WKWebView 之后。但是,从那时起,该代码已针对较新的 iOS 版本进行了扩展……现在将对其进行更新。【参考方案4】:

似乎他们已经向 repo 推送了一些更新:

https://github.com/ionic-team/cordova-plugin-wkwebview-engine/pull/171#issuecomment-377824347

因此,请确保删除 cordova ios 平台,添加最新版本的 wkwebview:cordova-plugin-ionic-webview 1.1.19,然后添加 npm install 并添加平台 ios。我刚刚测试过它就像一个魅力。

【讨论】:

我没有使用 Cordova,但经过多次谷歌搜索后,我已经找到了一种新的方式来嘶嘶作响(或者它是嘶嘶作响?)相关的 WebKit 功能。还是非常感谢! @SevenSystems 您能否分享您找到的解决方案?到目前为止,我们也不使用 Cordova,并且一直在解决这个问题。

以上是关于iOS 11.3 WKWebView:input.focus() 没有做任何事情的主要内容,如果未能解决你的问题,请参考以下文章

解决 WKWebView http POST 在 iOS 11.3 中不再发送参数的问题

fastclick使用与 fastclick ios11.3相关bug原因(ios输入框点击变得不灵敏,ios input失焦后,页面上移,点击不了)

如何在 wkwebview 中下载文件

HTML 输入自动完成在 WKWebview 中不起作用

如何使用 iOS WKWebView 注入 JavaScript 回调来检测 onclick 事件?

适用于 iOS 的 Cordova 和 localhost