【问题标题】:How to listen for when WkWebkiew has finished loading page?当 WkWebkiew 完成加载页面时如何监听?
【发布时间】:2019-01-04 09:25:16
【问题描述】:

我尝试在 stackoverflow 上实现其他代码,但没有成功。我正在评估 WKWeview 中的 javascript,并且想在内容完全加载时监听,以便在加载的页面上执行语句。

Javascript:(不执行 func webView)

webView.evaluateJavaScript("_formHist.submit();", completionHandler: nil)

到目前为止我尝试使用的代码:(仅适用于某些页面)

    func webView(_ webView: WKWebView,
    didFinish navigation: WKNavigation!) {
    //insert code
    }

我是 iOS 开发新手,如果可以的话,请详细解释答案!

【问题讨论】:

  • 你可以观察#keyPath(WKWebView.isLoading)

标签: swift wkwebview


【解决方案1】:

_formHist 是如何定义的??

如果这还没有被定义为一个 javascript 对象,它就不会工作。

除此之外,在执行代码时页面可能没有完全加载,因此您可能需要监听页面完全加载时触发的事件

如果您参考此answer,它会告诉您可以使用以下方法确定页面何时完全加载

document.addEventListener("DOMContentLoaded", function(event) { 
  //do work
});

所以对于你的情况,你只需要使用这个事件监听器

webView.evaluateJavaScript("document.addEventListener("DOMContentLoaded", function(event) { _formHist.submit(); });", completionHandler: nil)

试试看它是否有效

【讨论】:

  • 我不相信它有效。 _formHist 是网站输入的 onclick 事件。问题是提交_formHist后,我上面的函数没有被触发。
  • 这没有多大意义。要使_formHist.submit(); 起作用,_formHist 必须是引用 HTML 中的表单 DOM 元素的 JS 对象,但您没有显示任何代码如何分配 _formHist。如果我是您,我会做的第一件事是使用普通的桌面浏览器并在调试控制台中使用 JS 提交表单。然后,当您完全正常工作时,将 exact 相同的代码放入 DOMContentLoaded 事件侦听器回调中的评估 javascript 方法中
  • _formHist.submit();在浏览器中正常工作。以防我最初的问题不清楚,它的以下代码被执行到早期(在这里提供它以防有帮助): webView.evaluateJavaScript("document.getElementsByTagName('html')[0].innerHTML", completionHandler: {(innerHTML, error) in do { let transactionResponse = try TransactionResponse(innerHTML) }catch{}}) 如果我添加等待,它会起作用
  • var _divHist = $('divHist'); var _mnuPlan = $('mnuPlan'); var _formHist = new AJAXForm( 'svcHistForm', function HistoryDisplay( ajax ) { if ( ajax != null ) { _divHist.innerHTML = ajax.responseText; window.location = '#viewHist'; } else alert( 'Request failed' ); } ); function QuickHistory( planID ) { if ( _mnuPlan.value == planID ) { // plan already selected window.location = '#top'; return; } _mnuPlan.value = planID; if ( _mnuPlan.value == planID ) _formHist.submit(); else window.location = '#top'; }
  • 您没有提到您正在使用 jQuery,也没有在问题中显示所有这些代码。那么这段代码是你通过评估 javascript 传递的吗?或者这是网页上的脚本?
【解决方案2】:

也许您想让它同时变得更高级和简单,这样您就可以向用户显示估算进度,然后确保您可以检测到所有内容都已加载并完成,因此您可以做任何您想做的事情。你可以这样做:

webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "estimatedProgress" {
            print(Float(webView.estimatedProgress))
            //Do whatever you want when finished
        }
    }

【讨论】:

  • 我尝试实现这个,但是在我上面的javascript之后从未调用过该函数:webView.evaluateJavaScript("_formHist.submit();", completionHandler: nil)
  • 什么是_formHist??
  • _formHist 将浏览器带到下一页。 html:
  • var _divHist = $('divHist'); var _mnuPlan = $('mnuPlan'); var _formHist = new AJAXForm( 'svcHistForm', function HistoryDisplay( ajax ) { if ( ajax != null ) { _divHist.innerHTML = ajax.responseText; window.location = '#viewHist'; } else alert( 'Request failed' ); } ); function QuickHistory( planID ) { if ( _mnuPlan.value == planID ) { // plan already selected window.location = '#top'; return; } _mnuPlan.value = planID; if ( _mnuPlan.value == planID ) _formHist.submit(); else window.location = '#top'; }
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2014-03-19
  • 2014-12-20
  • 1970-01-01
  • 2014-04-13
  • 2015-03-23
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多