js更改本地html字体大小页面位置不发生改变

在开发HTML小说阅读器时遇到问题,当调整WebView字体大小后,页面位置发生变化。通过在JS中操作,实现了更改字体大小后保持原先阅读位置。初始化WebView和WebSettings,并在HTML加载前插入一段JS代码来实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做html页面小说阅读器时,发现更改webview的字体后,原来的位置不见了,因此想从js入手,改变字体大小后也能回到原来位置


具体做法:

先初始化webview 以及websettings,我在外部做了几个按钮,用来改变字体大小,调用的代码如下;

<span style="white-space:pre">	</span>            String js1 = " index = 0;\n"
                            + " nearIndex = null;\n"
                            + " var scrollTop  = document.body.scrollTop;\n"
                            + " var tags = document.getElementsByTagName(\"body\")[0].children;\n"
                            + " getNearIndex(tags, scrollTop);\n";
                    String js = "var d = document.getElementsByTagName('body')[0];\n"
                            + " d.style.fontSize = '" + font_size + "px';\n";
                    String js2 = " indexTemp = 0;\n"
                            + " skipScroll(tags, nearIndex);\n";

                    mWebView.loadUrl("javascript:(function(){" + js1+js+js2 + "})()");
                    SPUtils.setInt(UIUtils.getContext(), "mobifont", font_size);
这是通常的js做法,我刚开始是直接用js那一句,改变字体大小会发生变化,所以我现在加了两句 js1 +js2


还有一步你需要在初始化过程之前(加载html之前),提前给html写入一段js进去 如下:

final String path = UIUtils.getAppFile() + dirname + "/jingjing.html";
        String comment = mobi.openMobi(mFilePath + mFileName, dirname);
        //解决打不开的mobi情况 1.''是代表c解析不了的格式,?J是代表乱改后缀的格式
        if (comment.equals(""))
            comment = "?J";
        if (!comment.equals("?J")) {
            //js代码
            String result = comment.replace("</html>", "<script>" +
                    "   var index = 0;\n" +
                    "   var nearIndex = null;\n" +
                    "   var indexTemp = 0;\n" +
                    " function getNearIndex(tags, scrollTop) {\n" +
                    "        for (var i = 0; i < tags.length; i++) {\n" +
                    "            index++;\n" +
                    "            var tagTop = getPos(tags[i]);\n" +
                    "            if (tags[i].children.length > 0) {\n" +
                    "                getNearIndex(tags[i].children, scrollTop);\n" +
                    "            }else {if (parseInt(tagTop) > parseInt(scrollTop) && nearIndex==null) {//防止获取多层最近标签\n" +
                    "                    nearIndex = index;\n" +
                    "                    return;}}}}\n" +
                    "  function skipScroll(tags, nearIndex) {\n" +
                    "        for (var i = 0; i < tags.length; i++) {\n" +
                    "            indexTemp++;\n" +
                    "            console.log(indexTemp, nearIndex);\n" +
                    "            if (indexTemp == nearIndex) {\n" +
                    "                document.body.scrollTop = getPos(tags[i]);\n" +
                    "                return;\n" +
                    "            }\n" +
                    "            if (tags[i].children.length > 0) {\n" +
                    "                skipScroll(tags[i].children, nearIndex);\n" +
                    "            }}}\n" +
                    "  function getPos(o) {//取元素坐标\n" +
                    "            var  y = 0;\n" +
                    "            do {\n" +
                    "                y += o.offsetTop;\n" +
                    "            } while (o = o.offsetParent);\n" +
                    "            return y;\n" +
                    "        }\n" +
                    "   function toCatalog() {\n" +
                    "        var allTag = document.getElementsByTagName(\"a\");\n" +
                    "        for (var i = 0; i < allTag.length; i++) {\n" +
                    "            if (allTag[i].getAttribute(\"href\") != null) {\n" +
                    "                window.scrollTo(0, getPos(allTag[i]));//遍历所有a标签,找到第一个带有href属性的,获取高度,并跳出循环\n" +
                    "                break;\n" +
                    "            }\n" +
                    "        }\n" +
                    "    }</script></html>");
            writeFile(result, path);
            //webView.loadData(comment, "text/html; charset=UTF-8", null);
            //init local file
            mWebView.loadUrl("file://" + path);

提前写入备好的js根据滚动条位置查找最近P标签的位置。


这样就能使改变字体后也能回到原来位置的需求完成了。


最后附上在web端的代码:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值