В течение последних нескольких часов я пытался добавить слушателя, когда пользователь щелкает по этому элементу кнопки в 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 оценки, и пробовал код в разных местах (ie. viewDidLoad
, webView(didFinish)
, webView(didStartProvisionalNavigation)
, et c):
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
. Это вывод на консоль для каждого JS вызова в webView(didFinish)
:
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
, но это также сгенерирует ошибку при нажатии кнопки.
Таким образом, теоретически я мог бы создать флаг для проверки нажатия этой кнопки; однако я предпочел бы что-то более конкретное, чем этот хакерский обходной путь:
// 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 }
}
Любая помощь будет высоко ценится, и спасибо, что нашли время, чтобы прочитать этот вопрос!