相对于分享代码更希望与你们分享编程思路,欢迎评论区讨论

最近在追几部小说,大家都知道手机浏览器大部分都会有小说模式,奈何手机没电想让他安静地充电,但是电脑上的各大小说网的阅读模式其实都不是很友好,或者充斥着大量的广告,但是本着懒得找的原则,手写了个插件来改善自己的阅读体验。

本代码只针对提供网站有效,其他网站可能需要凭借自己的知识修改部分正则表达式和DOM名称才可使用

流程构思

  1. 获取当前页面的标题下一页链接内容存入变量
  2. 重构页面样式
  3. 写入刚才保存的数据
  4. 监听页面滚动事件
  5. 获取下一页dom
  6. 正则匹配标题下一页链接内容追加补充到第一次渲染出来的正文下方
  7. 循环起来RUA~

实现

一、 随意打开其中的一篇小说,使用开发者工具确认章节标题、内容和下一页链接
标题

内容

下一章

变量赋值

//下一页链接
var nextHref = $(".bottem a").eq(3).attr("href");
//标题
var bookname = $(".bookname h1").text();
//正文
var content = $("#content").html();

页面元素清空同时创建自定义样式

$("body").html("<div id=\"content\"></div>");
$("#content").css({"width":"80%","margin":"20px auto"
});

定义渲染文章方法

function getHtml(){//获取当前已有内容var html = $("#content").html();//追加标题html+=`<br/><h1>${bookname}</h1>`;//追加正文html+=`<div style="font-size: 30px;">${content}</div><br/><br/><br/>`;//渲染至html上$("#content").html(html);//设置标题样式$("h1").css({'font-size': '50px','text-align': 'center'});
}

监听滚动事件

//获取下一页状态(防止重复拉取)
var type = true;
$(window).scroll(function() {  //页面高度var pageHeight = document.body.scrollHeight//滚动条高度(多浏览器兼容)var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;//如果当前没有获取过当前章的下一页,//且高度达到页面的4/5的位置,就是快看完了。//获取下一章的html,//因为是html所以采用get的方式获取,且返回的是html的字符串if(scrollHeight/pageHeight>0.8&&type){type = false;//改变获取状态为不可获取$.get(nextHref,function(res){initContent(text)//从字符串中获取自己需要的数据,下文中解释type = true;//改变获取状态为可获取});}
})

字符串处理函数

  • 分析了一下他的页面发现标题下一页链接参数其实都在页面中存在的,于是根据下图匹配相应的正则
  • 而正文部分依然可以从页面中一个名为content的ID中使用正则匹配
function initContent(text){var nextregOne = /(?<=(var index_page = "))[a-z:/._0-9]+/ivar nextregTwo = /(?<=(var next_page = "))[0-9]*.html/i;var contentreg = /(<div id="content"[>]*>)([\s\S]*?)(<\/div[>]*>?)/ivar titlereg = /(?<=(var readtitle = "))[\u4e00-\u9fa5 0-9]*/i;//章节名bookname = titlereg.exec(text)[0];//下一章链接 两个变量拼接而成nextHref   = nextregOne.exec(text)[0];nextHref   += nextregTwo.exec(text)[0];//正文content    = contentreg.exec(text)[2];//调用追加html方法追加内容getHtml();
}

自动滚动起来是不是会更加方便一些呢
创建自动滚动方法

var scrollGo = setInterval(function(){//页面高度var pageHeight = document.body.scrollHeight//滚动条高度var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;if(pageHeight-scrollHeight>0){window.scrollTo(0,scrollHeight+1);}
},10);//速度可调

至此基本功能已完结,直接扔到控制台即可快乐食用
全部代码见文末

高级功能

完成基本控制

  1. 点击美化,进入自定义小说模式
  2. 点击滚动,自动向下滚动
  3. 点击停止滚动,停止滚动
  4. 点击加速滚动速度加快
  5. 点击减速滚动速度减慢
  6. 显示当前章节名称和当前页面网址(便于储存进度)

界面管理样式

创建tools工具栏

$("body").append(`<ul id="tools"><li id="title">标题</li><li id="into">美化</li><li id="begin">滚动</li><li id="up">加速</li><li id="down">减速</li></ul>`);

设置样式

function creatCss (argument) {$("body").css.backgroundColor="#E9FAFF";$("#content").css({"width":"80%","margin":"20px auto"});$("#tools").css({"position": "fixed","right": "0px","top": "0px","width": "10%"});$("#tools>li").css({"list-style": "none","font-size": "20px","margin": "5px 0px","border": "3px solid #eeeee5","border-radius": "10px","text-align": "center","cursor": "pointer"});
}


封装四个事件

//开启滚动
function startScroll(){clearInterval(scrollGo);scrollGo = setInterval(function(){//页面高度var pageHeight = document.body.scrollHeight//滚动条高度var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;if(pageHeight-scrollHeight>0){window.scrollTo(0,scrollHeight+1);}},speed);
}
function initTools () {//美化$("#into").click(function() {if( $("#into").text()="美化"){var str = `<div id="content"></div><ul id="tools"><li id="title">标题</li><li id="into">取消美化</li><li id="begin">滚动</li><li id="up">加速</li><li id="down">减速</li></ul>`;$("body").html(str);function scrolling(){};creatCss();getHtml();initTools ();}else{window.location.href = url;}});//滚动$("#begin").click(function() {if($("#begin").text()=="滚动"){$("#begin").text("停止滚动")startScroll();}else{$("#begin").text("滚动")clearInterval(scrollGo);}});//加速$("#up").click(function() {if(scrollGo!=0){speed = speed>20?(speed-20):(speed>2?(speed-2):speed);startScroll();}else{alert("当前未开启滚动");}});//减速$("#down").click(function() {if(scrollGo!=0){speed = speed+20;startScroll();}else{alert("当前未开启滚动");}});
}

修改追加文本时的逻辑

//判断是不是最新的标题和内容
var nnew = false;
//获取下一页状态
var type = true;
//监听滚动条滚动
$(window).scroll(function() {  //页面高度var pageHeight = document.body.scrollHeight//滚动条高度var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;if(pageHeight-scrollHeight<2000&&type&&!nnew&&pageHeight-scrollHeight>=650){type = false;$.get(nextHref,function(res){initContent(res);type = true;nnew = true;});}//上面先获取存入变量看完后再追加if(pageHeight-scrollHeight<650&&nnew){nnew=false;getHtml();}
})

总结

里面遇到了几个难点,追加文本加载的时机、如何防止多次拉取下一页,说是难点不是因为它写的难,而是有多种实现方法,需要找到让人看起来最舒服的方法比较难。
在这里其实偷了个小懒,用了网站自带的JQuery,以后面的这种高级优化之后其实更实用于油猴插件TamperMonkey,这样可以在网站加载时自动注入JS,省了很多操作,同时可以在里面直接引入JQuery,让我们可以在即使没有JQuery的网站也可以方便食用。

油猴插件配置(不知道的自行百度)


有更好的优化可以在评论区回复,么么哒~

高级功能版本,点击自取

简单版全部js代码

// http://www.biquge.info/54_54083/7205717.html//标题
var bookname = $(".bookname h1").text();
//正文
var content = $("#content").html();
//下一页链接
var nextHref = $(".bottem a").eq(3).attr("href");$("body").html("<div id=\"content\"></div>");
$("#content").css({"width":"80%","margin":"20px auto"
});
//获取下一页状态
var type = true;
getHtml();var scrollGo = setInterval(function(){//页面高度var pageHeight = document.body.scrollHeight//滚动条高度var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;if(pageHeight-scrollHeight>0){window.scrollTo(0,scrollHeight+1);}
},10);//监听滚动条滚动
$(window).scroll(function() {  //页面高度var pageHeight = document.body.scrollHeight//滚动条高度var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;if(scrollHeight/pageHeight>0.8&&type){type = false;$.get(nextHref,function(res){initContent(res);type = true;});}
})  function getHtml(){var html = $("#content").html();html+=`<br/><h1>${bookname}</h1>`;html+=`<div style="font-size: 30px;">${content}</div><br/><br/><br/>`;$("#content").html(html);$("h1").css({'font-size': '50px','text-align': 'center'});
}function initContent(text){var nextregOne = /(?<=(var index_page = "))[a-z:/._0-9]+/ivar nextregTwo = /(?<=(var next_page = "))[0-9]*.html/i;var contentreg = /(<div id="content"[>]*>)([\s\S]*?)(<\/div[>]*>?)/ivar titlereg = /(?<=(var readtitle = "))[\u4e00-\u9fa5 0-9]*/i;bookname = titlereg.exec(text)[0];nextHref   = nextregOne.exec(text)[0];nextHref   += nextregTwo.exec(text)[0];content    = contentreg.exec(text)[2];getHtml();
}

JavaScript实现小说阅读插件相关推荐

  1. [IDEA] chapter_reader - idea看小说阅读插件 - idea摸鱼插件

    chapter_reader IDEA 在线&本地小说阅读摸鱼插件 文章目录 chapter_reader IDEA 在线&本地小说阅读摸鱼插件 公告信息: 文章中所有用[]括起来,仅 ...

  2. 【原生Javascript案例】封装小说阅读器插件

    完整代码地址:原生JS开发小说阅读器插件 ;(function() {var sHeight = getViewportSize().height, // 视口的高度wHeight = getScro ...

  3. 小说阅读网html+css+JavaScript

    大一实训项目,做的偏静态的小说阅读网页,有广告弹窗,图片轮播,鼠标特效,登录注册验证,5个子页面,里头包含了写的实训报告,做的第一个项目,写的都比较粗糙. 如果需要代码的可以加我qq 资源链接 写的都 ...

  4. 精心挑选12款优秀的 JavaScript 日历和时间选择插件

    今天这篇文章向大家分享12款精心挑选的优秀 JavaScript 日历和时间选择插件,都带有详细的使用教程和效果演示.这些插件能够帮助 Web 开发人员更快速的实现各种精美的日历和时间选择效果.同时推 ...

  5. 本地小说阅读网站打造

    目录 一.本地小说网站总体组织框架 1.所需的VUE库和elementLib以及JQ库 2.本地目录设计 3.整体代码样式 二.正文核心代码 1.引入element 样式,和自定义的样式 2.引入JS ...

  6. 微信小程序小说阅读器/在线故事阅读丨可以android studio运行

    <微信小程序小说阅读器+后台管理系统|前后分离VUE>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用 ...

  7. Java基于SpringBoot+Vue+nodejs的在线小说阅读平台 element

    随着网络的发展,越累越多的网络小说出现在了人们的视野中,当前大多数小说网站都是收费的,虽然也有一些免费的小说网站,但是这些网站一般都会有大量的弹窗和广告对用户的阅读有很大的影响.为了能给小说爱好者一个 ...

  8. 安卓手机上有哪些好用的小说阅读器?

    现在,使用手机阅读的人真的越来越多了,我在地铁通勤路上经常能看到有人拿着手机看小说.作为小说爱好者,经过多款测评,选出以下小说阅读器,体验相对较好,推荐给喜欢在手机上看小说的朋友们. 第一款:Neat ...

  9. 基于Springboot的在线网络小说阅读网站的设计与实现

    摘  要 现在是互联网快速发展的时代,网络是一种新媒体的类型,被称为"第四媒体",随着越来越多的人进入互联网时代,网络阅读一种由文本的变化所带来的新的阅读方式,借助计算机.网络技术 ...

最新文章

  1. python 遍历字符串
  2. 红帽linux配置网桥#039;,redhat配置网桥
  3. 人工智能项目正在起飞:这对未来的工作意味着什么?
  4. Spring MVC 基础注解之@RequestMapping、@Controller、(二)
  5. 【Linux】一步一步学Linux——Linux文件属性详解(28)
  6. 实验四 恶意代码技术
  7. linux php7 mongodb,CentOS 7下安装配置PHP7跟LAMP及MongoDB和Redis
  8. 前端学习(806):数据类型内存分配
  9. javascript之调度:setTimeout 和 setInterval
  10. Atitit 高级人员要看哪些源码 目录 1. Ati看过的源码 1 1.1. Ui类 1 1.2. Mvc类 1 1.3. 数据库类 1 1.4. 算法类 1 2. 看源码的意义 2 2.1. 一
  11. 瑞斯凯X9D Plus无法连接DCL模拟器的解决方法
  12. linux下载安装自我见解
  13. MATLAB 绘图笔记——绘制两端尖角colorbar
  14. [分享]RFID之我的M1离线卡爆破过程
  15. 读书的故事(转百度知道)
  16. java手风琴代码_[Java教程]18款jquery抽屉式手风琴导航特效代码
  17. 1K2G保驾护航,无穷小真理放光芒
  18. python更新excel内容_[原创]使用 Python 读写 Excel 文件(一)更新
  19. 安卓微信跳转页面、重定向页面空白,ios系统正常、pc正常、安卓浏览器正常。
  20. iOS刷机后安装源和插件

热门文章

  1. 14 | 网络安全:和别人共用Wi-Fi时,你的信息会被窃取吗?
  2. hnu云计算个人实验报告——实验一
  3. me检测到的车道线投影到相机坐标系下
  4. 取消微软浏览器工具栏的发现按钮
  5. 【C语言实现小游戏篇】一起来回忆童年,写一写你童年的井字棋吧~ [ C语言实现 ] [ 超详细,超清楚 ] [ 有代码 ]
  6. python设计抽奖游戏 球_Python模拟轮盘抽奖游戏
  7. Cannot save file. Sharing violation
  8. c语言中indexOf()的用法
  9. c# DateTime格式
  10. ABAQUS2022与UG12.0许可证冲突问题原因及解决方法