Javascript 在WKWebView中使用scrollIntoVIew可跳转到页面顶部

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

使用下面的代码,我尝试将HTML加载到WKWebview中,然后将其滚动到特定元素

  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视图确实完成了加载,但是滚动视图没有完成加载

我的解决办法如下:

  • 使ViewController同时符合
    WKWebViewNavigationDelegate
    UIScrollViewDelegate
    协议
  • 向ViewController添加两个属性。一个是用于存储滚动视图内容偏移量的CGPoint,另一个是用于跟踪Web视图是否已完成加载的布尔值,其值为false
  • didfish
    委托方法中,将
    position
    的值设置为滚动视图的内容偏移量,并将
    webViewFinished
    设置为
    true
  • scrollViewDidScroll
    delegate方法中,检查Web视图是否已完成加载。如果已设置,则将滚动视图的内容偏移设置为
    position
    ,并将
    webViewFinished
    设置为
    false
    (否则,每次用户滚动时都会运行此代码)。别忘了在
    位置
    上进行可选链接
  • 最后但并非最不重要的一点是,设置Web视图/滚动视图的代理
  • 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
    }