Skeleton

使用 WebView.Skeleton 可以在避免 WebView 加载过程中出现白屏的尴尬情况。

主动 Skeleton

原理:提前将 targetURL 中的内容,使用 snapshotURL 加载并截屏,当 targetURL 要显示时,则先将截图置于白屏 WebView 上作为 Skeleton。

在任何页面,使用以下方式,保存截屏。

JSMessage.newMessage("WebView.Skeleton", {opt: "snapshot", targetURL: "http://xxx.com/target.html", snapshotURL: "http://xxx.com/snapshot.html"}).call(null);
  • targetURL 和 snapshotURL 只支持以 http:// https:// file:// 开头的完整路径。

被动 Skeleton

原理:WebView 加载成功前,一个 skeleton.html 的页面会被优先加载,并显示在屏幕上。

在页面加载完成时,skeleton.html 会被隐藏,你也可以手动控制 skeleton.html 隐藏的时机。

skeleton.html

skeleton.html 应该被放置在 iOS 的应用包中,Android 的 assets 目录下。

skeleton.html 没有任何 LEGO-SDK 的执行权限。

skeleton.html 模板如下

<!DOCTYPE html>
<html lang="en">
<body>
    ...
</body>

<script>

    function canHandleRequest(url) {
        // 通过 url 来判断,返回 true 代表,skeleton.html 应该出现在白屏阶段。
        if (url.startsWith('http://duowan.cn/')) {
            return true;
        }
        return false;
    }

    function handleRequest(url) {
        // 响应 url 的请求,并更改 skeleton.html 内容。
        // 返回 true 代表,你需要自行控制 skeleton.html 消失的时机。
        // 默认应该返回 false,代表 WebView 加载完成后,skeleton.html 自动消失。
        return false;
    }

</script>

</html>

隐藏 Skeleton

正常情况下,Skeleton 会在 WebView 加载完成后消失。

主动 Skeleton

可以使用以下方法,提前隐藏 Skeleton,否则 Skeleton 会在 WebView 加载完成后消失。

JSMessage.newMessage("WebView.Skeleton", {opt: "dismiss"}).call(null);

被动 Skeleton

但是,当 skeleton.html 中的 handleRequest 方法返回 true 时,需要使用以下方法,手动隐藏 Skeleton。

JSMessage.newMessage("WebView.Skeleton", {opt: "dismiss"}).call(null);