scrollIntoView导致WKWebView部分无响应

时间:2017-08-29 08:46:54

标签: wkwebview ios11 js-scrollintoview

我在iOS 11测试版中遇到了混合iOS应用程序的问题。它基本上是在WKWebView内运行的Web应用程序。 iOS 10中存在的问题,但已在iOS 11中引入。从测试版8开始,问题仍然可以重现。

当webapp多次调用JavaScript函数scrollIntoView时,GUI的某些部分将无法响应。

以下简化的HTML文件演示了此问题:

<!DOCTYPE html>
<html><head>
    <meta charset="UTF-8">
        <meta id="viewportMeta" name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
            <title>Testcase</title>
            <script>

                let numClicks = 0;

                function runScrollIntoView() {
                    document.querySelector(".element-1").scrollIntoView();
                }

            function debugInfo() {
                return {
                    "window.screen.height": window.screen.height,
                    "window.screen.availHeight": window.screen.availHeight,
                    "document.body.scrollTop": document.body.scrollTop,
                    "document.body.scrollHeight": document.body.scrollHeight

                };
            }

            function clickHandler() {
                numClicks++;
                document.querySelector('.counter').innerText += numClicks + " clicks, " + JSON.stringify(debugInfo()) + "\n";
            }
            </script>

            <style>
                .instructions div {
                    border: 1px solid blue;
                    color: blue;
                }

            .counter {
                width: 300px;
                height: 300px;
                border: 1px solid black;
            }

            </style>

</head>
<body>

    <div class="instructions">
        <div onclick="clickHandler()">1. Click me to run click handler</div>
        <div onclick="runScrollIntoView()">2. Click me to run Element.scrollIntoView</div>
        <div onclick="clickHandler()">3. Click me to run click handler again</div>
        <div onclick="runScrollIntoView()">4. Click me to run Element.scrollIntoView again</div>
        <div onclick="clickHandler()">5. Click me to try run click handler again - nothing happens</div>
        <div>(Repeat 4-5 if necessary)</div>
    </div>

    <div class="counter">
        Number of clicks
    </div>

    <div class="element-1">Target to scrollIntoView</div>

</body>
</html>

...加载此viewcontroller时:

import UIKit
import WebKit
import Foundation
import SystemConfiguration

class ViewControllerNgf: UIViewController, WKNavigationDelegate, WKUIDelegate {

    var webView: WKWebView!

    override func loadView() {
        self.webView = WKWebView(frame: CGRect.zero)
        webView.navigationDelegate = self
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.loadWebApp()
    }

    fileprivate func loadWebApp() {
        let htmlFile = Bundle.main.path(forResource: "htmlfile", ofType: "html")
        let html = try? String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)

        DispatchQueue.main.async {
            self.webView!.loadHTMLString(html!, baseURL: nil)
        }
    }
}

我已将此报告为Apple的错误,但尚无响应,导致我认为我在应用中做错了什么。但Swift代码基本上是从Apple's documentation复制的。

那可能是什么问题?

1 个答案:

答案 0 :(得分:0)

问题似乎已在iOS 11.2中得到解决。