天天看點

微信閱讀. 電腦版. 标記上一頁閱讀到的位置. 油猴(Tampermonkey)插件

前言

最近喜歡用微信讀書.電腦版進行看書,

可以豎屏的那種,一頁可以顯示好多内容,

讀起來感覺很好哈,

并且感覺讀起來都快了很多.

手機或者Kindle翻了好幾頁才能讀完的,

我使用微信電腦版,豎屏翻個三五下完事...

但是也遇上一件事,畢竟一頁顯示的行數比較多,

每次翻頁完,第一件事先找從哪行開始讀...

體驗就差點意思了.

這個時候想起了油猴,自己可以寫一個插件搞一下嘛...

分析微信讀書html源碼

當時是正在看<天才在左瘋子在右>,

浏覽器F12,檢視html源碼,

我本來以為是一些文本之類的...

想的直接将此頁的最後一行文本,

用黃色或者紅色标記出來.

結果發現是類似下面這樣的...↓

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

<canvas style="position:absolute;left:0;top:8px;width:800px;height:3989px;" width="800" height="3989">
</canvas>
<canvas style="position:absolute;left:0;top:4012px;width: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;width: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;width: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;width: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)插件