如何解决WKWebView不适用于EvaluationJavaScript表单提交
在我们的应用程序中,我们正在动态创建带有输入字段的表单,并依靠valuateJavaScript()函数提交表单并将URL加载到决策处理程序中。这种方法运行良好,并且似乎已在iOS 14中被打破(经过测试的Beta 3、4、5)。在iOS 14之前,以下代码导致调用了definePolicyFor委托函数,但在iOS 14中未调用它。
到目前为止,我发现的唯一解决方案是在调用form.submit()(javascriptForExecution()函数中的注释行)之前将“ form”添加到dom中。
还有其他建议/想法吗?
override func viewDidLoad() {
super.viewDidLoad()
webView.evaluateJavaScript(javascriptForExecution()) { (result,error) in
if error != nil {
print("Javascript execuption failed: \(error.debugDescription)")
}
}
}
private func javascriptForExecution() -> String {
return """
var form = document.createElement('form');
form.method = 'POST';
form.action = 'https://www.example.com/';
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'Name';
input.value = 'NameValue';
form.appendChild(input);
//document.body.appendChild(form)
form.submit();
"""
}
// WKNavigationDelegate
public func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.request.url?.absoluteString == "https://www.example.com/" {
if let url = URL(string: "https://www.apple.com") {
webView.load(URLRequest(url: url))
}
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
解决方法
下面来自Apple的回复
我们查看了您的报告,并确定您当前遇到的行为符合预期。 这是故意更改,以符合HTML规范
WKWebView正常运行,并且这种行为上的变化是由于WebKit与HTML5标准更加紧密地结合在一起,该标准要求仅在表单“连接”(即DOM的一部分)的情况下提交表单。>
HTML标准PR:https://github.com/whatwg/html/pull/2613
表单提交按钮需要与文档相关联,并需要在文档的节点树中。 https://dom.spec.whatwg.org/#connected
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。