【发布时间】:2020-07-20 00:25:52
【问题描述】:
我一直在尝试为用户在 WKWebView 中单击此按钮元素时添加一个侦听器:
<div class="web-navigation__auth" data-test-web-chrome-auth="">
<button class="web-navigation__auth-button web-navigation__auth-button--sign-in button button-reset button--auth">
<svg ... ></path></g></svg>
Sign In
</button>
<div class="web-chrome-auth-container__spinner web-chrome-auth-container__spinner--hidden"></div>
</div>
我尝试观察使用许多不同的 JavaScript 评估,并在不同的地方尝试了代码(即viewDidLoad、webView(didFinish)、webView(didStartProvisionalNavigation) 等):
let js1 = "document.addEventListener('click', function(e) { e = e || window.event; if(e.target.getAttribute('class') == 'web-navigation__auth-button') { console.log(e.target.value); } });"
let js2 = "var elements = document.getElementsByClassName('web-navigation__auth'); var myFunction = function() { var attribute = this.getAttribute('web-navigation__auth-button--sign-in'); alert(attribute); }; for (var i = 0; i < elements.length; i++) { elements[i].addEventListener('click', myFunction, false); }"
let js3 = "document.addEventListener('click', getElementsByClassName('web-navigation__auth-button').onclick();"
webView.evaluateJavaScript(js) { (key, err) in
if let err = err {
print(err.localizedDescription)
} else {
print("JS: You tapped the Sign In button!")
}
}
控制台的输出似乎只在调用webView.evaluateJavaScript 时出现,不是在按下按钮时出现。除了下面关于js3 的注释之外,我没有得到任何代码在按下按钮时触发。这是webView(didFinish) 中每个 JS 调用的控制台输出:
js1: A JavaScript exception occurred // on webView.didFinish
JS: You tapped the Sign In button! // on webView.didFinish
js2: A JavaScript exception occurred // on webView.didFinish
JS: You tapped the Sign In button! // on webView.didFinish
js3: A JavaScript exception occurred // on webView.didFinish
A JavaScript exception occurred // on Sign In button click (fired again)
关于js3 需要注意的一点是,它会在webView.didFinish 上触发错误消息,但如果按下按钮,它也会触发错误。
所以理论上,我可以创建一个标志来检查该按钮的点击;但是,我更喜欢比这个 hacky 解决方法更具体的东西:
// Error output to console on every new page load AND "Sign In" button click
var pageLoad = false // Page has not yet loaded, false by default
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
pageLoad = true // Page has loaded, unless new URL detected, next error = button click!
if webView.urlHasChanged() { pageLoad = false }
let js3 = "document.getElementsByClassName('web-navigation__auth-button').onclick();"
webView?.evaluateJavaScript(js3) { (key, err) in
if let err = err {
if pageLoad {
// Error message && pageLoad = "Sign in" button pressed: CODE HERE
}
}
if pageLoad && url.hasNotChanged() { pageLoad = false }
}
【问题讨论】:
标签: javascript ios swift macos wkwebview