Javascript 在WKWebView中使用scrollIntoVIew可跳转到页面顶部
使用下面的代码,我尝试将HTML加载到WKWebview中,然后将其滚动到特定元素Javascript 在WKWebView中使用scrollIntoVIew可跳转到页面顶部,javascript,ios,swift,webkit,wkwebview,Javascript,Ios,Swift,Webkit,Wkwebview,使用下面的代码,我尝试将HTML加载到WKWebview中,然后将其滚动到特定元素 let url = Bundle.main.url(forResource: "TestHTML", withExtension: "html")! myWebView.loadFileURL(url, allowingReadAccessTo: url) myWebView.evaluateJavaScript("document.getElementById('4').scrollInto
let url = Bundle.main.url(forResource: "TestHTML", withExtension: "html")!
myWebView.loadFileURL(url, allowingReadAccessTo: url)
myWebView.evaluateJavaScript("document.getElementById('4').scrollIntoView(true);") {[weak self] (result, error) in
print("result: \(result)")
print (error)
}
但是,当我运行它时,页面会加载,滚动到该部分,然后跳回页面顶部
我还尝试设置了
scrollView
的contentOffset
,结果出现了完全相同的问题您应该在webview委托方法中编写javascript评估代码
别忘了设置webview delgate
myWebView.navigationDelegate = self
几个月前,我发表了这个问题,在为一个演示项目工作时,它在另一个项目中对我不起作用——它会转到偏移量,然后再回到顶部 问题似乎是当
webView(didfish)
中的代码运行时,web视图确实完成了加载,但是滚动视图没有完成加载
我的解决办法如下:
WKWebViewNavigationDelegate
和UIScrollViewDelegate
协议didfish
委托方法中,将position
的值设置为滚动视图的内容偏移量,并将webViewFinished
设置为true
scrollViewDidScroll
delegate方法中,检查Web视图是否已完成加载。如果已设置,则将滚动视图的内容偏移设置为position
,并将webViewFinished
设置为false
(否则,每次用户滚动时都会运行此代码)。别忘了在位置
上进行可选链接李>
myWebView.navigationDelegate = self
class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate {
//..
}
var position: CGPoint?
var webViewFinished = false
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
position = myWebView.scrollView.contentOffset
webViewFinished = true
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if webViewFinished {
webViewFinished = false
if let p = position {
web.scrollView.setContentOffset(p, animated: false)
}
}
}
override func viewDidLoad(){
super.viewDidLoad()
myWebView.navigationDelegate = self
myWebView.scrollView.delegate = self
}