WKWebView 不适用于 evaluateJavaScript() 表单提交
WKWebView does not work on evaluateJavaScript() form submit
在我们的应用程序中,我们动态创建一个带有输入字段的表单,并依靠 evaluateJavaScript() 函数提交表单并在决策处理程序中加载 url。这种方法一直运行良好,似乎已在 iOS 14(测试 beta 3、4、5)中被破坏。在 iOS 14 之前,下面的代码导致 decidePolicyFor 委托函数被调用,但它在 iOS 14.
中没有被调用
到目前为止我找到的唯一解决方案是在调用 form.submit() 之前将“表单”添加到 dom(javascriptForExecution() 函数中的注释行)
还有其他 suggestions/ideas 吗?
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 标准公关:https://github.com/whatwg/html/pull/2613
表单提交按钮需要与文档相关联,并且在文档的节点树中。
https://dom.spec.whatwg.org/#connected
在我们的应用程序中,我们动态创建一个带有输入字段的表单,并依靠 evaluateJavaScript() 函数提交表单并在决策处理程序中加载 url。这种方法一直运行良好,似乎已在 iOS 14(测试 beta 3、4、5)中被破坏。在 iOS 14 之前,下面的代码导致 decidePolicyFor 委托函数被调用,但它在 iOS 14.
中没有被调用到目前为止我找到的唯一解决方案是在调用 form.submit() 之前将“表单”添加到 dom(javascriptForExecution() 函数中的注释行)
还有其他 suggestions/ideas 吗?
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 标准公关:https://github.com/whatwg/html/pull/2613
表单提交按钮需要与文档相关联,并且在文档的节点树中。 https://dom.spec.whatwg.org/#connected