前言

最近喜欢用微信读书.电脑版进行看书,
可以竖屏的那种,一页可以显示好多内容,
读起来感觉很好哈,
并且感觉读起来都快了很多.
手机或者Kindle翻了好几页才能读完的,
我使用微信电脑版,竖屏翻个三五下完事…

但是也遇上一件事,毕竟一页显示的行数比较多,
每次翻页完,第一件事先找从哪行开始读…
体验就差点意思了.

这个时候想起了油猴,自己可以写一个插件搞一下嘛…

分析微信读书html源码

当时是正在看<天才在左疯子在右>,
浏览器F12,查看html源码,

我本来以为是一些文本之类的…
想的直接将此页的最后一行文本,
用黄色或者红色标记出来.

结果发现是类似下面这样的…↓

<div class="wr_canvasContainer" style=" 800px; height: 6160px;">

<canvas style="position:absolute;left:0;top:8px;800px;height:3989px;" width="800" height="3989">
</canvas>
<canvas style="position:absolute;left:0;top:4012px;800px;height:2141px;" width="800" height="2141">
</canvas>

</div>

两个canvas元素.
可能是为了爬取文本内容搞得一些东西.
文本标颜色的计划出师未捷身先死…
想着在这个canvas上做文章吧…

初版.canvas.涂鸦之旅

先要找到本页的最后一行的高度是多少…
本来以为这个高度估计还需要一番计算.
搜索了浏览器的各种高度…
并且涉及到滚动条…
最后终于找到一个属性↓

//返回文档在窗口垂直方向滚动的像素
window.pageYOffset

有了这个高度,就很好搞了.
开始在画布上涂鸦…

// ==UserScript==
// @name         微信阅读.翻页.标记上一页读的位置
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://weread.qq.com/web/reader/*
// @grant        none
// @require      http://libs.baidu.com/jquery/2.1.4/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';
    $(document).keydown(function(event){
    if(event.keyCode == 34){
      MarkLine();
    }
  });
    // Your code here...
    function MarkLine(){

        var yHeight = window.pageYOffset + document.body.clientHeight - 200;
        console.log("当前window.pageYOffset..." + window.pageYOffset);
        console.log("当前document.body.clientHeight..." + document.body.clientHeight);

        var dIndex = 0;
        if(yHeight > 3967){
            dIndex = 1;
            yHeight -= 3995;
        }
        var c=document.getElementsByTagName("canvas")[dIndex];

        var ctx=c.getContext("2d");

        // 创建渐变
        var grd=ctx.createLinearGradient(0,0,200,0);
        grd.addColorStop(0,"red");
        grd.addColorStop(1,"white");
        // 填充渐变
        ctx.fillStyle=grd;
        ctx.fillRect(600,yHeight,300,1);
    }
})();

局限性
后来打开<剑来>看了一章,发现了问题.
刚开始的几页确实标记了,但是往后就不会再标记…
打开F12瞅了下,发现了问题所在:
一章节如果文本太多的话,前几页确实还是在画布上,
但是后面的就是一些打乱的文本了.

总结就是↓
适合那种一章节文本不是很多,
高度不是很高(大概高度不超过6160的书籍)
比如,<天才在左疯子在右>
如果看<剑来>这样一章节万八千字的,
这种也就适合前两页翻页…

改进.html.涂鸦

后来就想了下,刚开始被canvas牵着鼻子走了,
因为文本是在画布上,就想着在canvas上下功夫,
但是canvas终究是html代码中的…
直接在html中修改不是更好吗?

想到是搞一个div,然后显示为一个横线,主要改style,
来让这个横线显示在想出现的位置…

<div id="mkDiv" style="position:absolute;border: 1px solid red;left:1200px;top:26386px;200px;"></div>
// ==UserScript==
// @name         微信阅读.翻页.记录上一页阅读位置
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://weread.qq.com/web/reader/*
// @grant        none
// @require      http://libs.baidu.com/jquery/2.1.4/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';
    //新建一个div,用于显示为一条线
    var newDiv = document.createElement("div");
    newDiv.style="position:absolute;border: 1px solid red;left:1200px;top:26386px;200px;";
    newDiv.id="mkLineDiv"
    document.body.appendChild(newDiv);

    $(document).keydown(function(event){
        //翻页按键.Page Down
        if(event.keyCode == 34){
            MarkLine();
        }
    });
    // 标记上一页阅读
    function MarkLine(){
        var htmlHeight = window.pageYOffset + document.body.clientHeight - 40;
        var tempStyle="position:absolute;border: 1px solid red;left:1200px;top:"+(htmlHeight)+"px;200px;";
        console.log(tempStyle);
        $("#mkLineDiv").attr("style",tempStyle);
    }
})();

结尾

其实,关于翻页还需要标记上一页读的位置,
有人可能觉得多此一举,
每次翻页后,接着从这一页的最上面读就是了呗…
我根据自己的体验,总结了2点我觉得需要更改的.

1. 如果这一章节,有2.5页,
微信读书电脑版,当你翻到最后一页的时候,
最后一页不是显示2.0页~2.5页的内容,
而是显示1.5页~2.5页的内容.

2. 例如,30行为一页的内容,一章节一共2页,
我翻到第二页的时候,直接显示31行,
我总是感觉30行与31行之间还有内容是未读的…
总是在按一下”↑”往上翻一行确认下….

总之,个人习惯,因人而异.

最后上一张,标记后的章节…(√,你没看错,就是那一个红色的横线…)
微信阅读. 电脑版. 标记上一页阅读到的位置. 油猴(Tampermonkey)插件-风君雪科技博客