bookdetail.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0" />
  6. <link rel="shortcut icon" href="favicon.ico" />
  7. <link rel="bookmark" href="favicon.ico" type="image/x-icon"   />
  8. <title>2023年中国航油-管理年鉴</title>
  9. <link rel="stylesheet" href="css/mui.min.css">
  10. <link rel="stylesheet" href="css/reset.css" />
  11. <link rel="stylesheet" href="css/main.css" />
  12. <style>
  13. .m-artical-action-mid {
  14. position: fixed;
  15. width: 100%;
  16. height: 40%;
  17. top: 30%;
  18. z-index: 9998;
  19. }
  20. #muluList {
  21. /*避免导航边框和列表背景边框重叠,看起来像两条边框似得;*/
  22. margin-top: -1px;
  23. }
  24. #muluList,
  25. #muluList .mui-table-view,
  26. .list-li-a,
  27. .mui-table-view-cell>a:not(.mui-btn).mui-active {
  28. background-color: #e9dfc7;
  29. }
  30. .highChapter {
  31. color: red !important;
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <div>
  37. <!--中间点击层-->
  38. <div class="m-artical-action">
  39. <div class="m-artical-action-mid" id="action_mid"></div>
  40. </div>
  41. <!--顶部导航-->
  42. <div class="nav-top" id="nav_top" style="display: none;">
  43. <div class="nav_container">
  44. <div class="nav_return nav_back_book"></div>
  45. <div class="nav_text nav_back_book" id="nav_text">返回书架</div>
  46. </div>
  47. </div>
  48. <!--主体内容-->
  49. <header id="header" class="top_mulu_box">
  50. <div class="top_mulu_return nav_back_book">
  51. < </div>
  52. <div class="top_mulu_text nav_back_book" id="ChapterTitle"></div>
  53. </header>
  54. <div class="container">
  55. <div class="Content">
  56. </div>
  57. <div class="page_btn">
  58. <button class="btn-prev" id="btn_prev">上一页</button>
  59. <button class="btn-next" id="btn_next">下一页</button>
  60. </div>
  61. </div>
  62. <!--底部导航栏 -->
  63. <div class="nav-bottom" id="nav_bottom" style="display: none;">
  64. <div class="btn-mulu">
  65. <div class="mulu">
  66. <div class="icon_mulu" id="icon_mulu"> </div>
  67. <div class="text_mulu">目录</div>
  68. </div>
  69. </div>
  70. <div class="btn_Aa">
  71. <div class="Aa">
  72. <div class="icon-Aa" id="icon_Aa"> </div>
  73. <div class="text_Aa">字体</div>
  74. </div>
  75. </div>
  76. <div class="btn-yejian">
  77. <div class="yejian">
  78. <div class="icon-yejian" id="icon_yejian"> </div>
  79. <div class="text_yejian">夜间</div>
  80. </div>
  81. </div>
  82. <!--字体功能栏-->
  83. <div class="fontPop" id="font_Pop" style="display: none;">
  84. <div class="fontSize">
  85. <span>字号</span>
  86. <button class="btnBig" id="btn_Big">大</button>
  87. <button class="btnSmall" id="btn_Small">小</button>
  88. </div>
  89. <div class="fontBk">
  90. <span>背景</span>
  91. <div class="bkColor">
  92. <div class="bk-container" style="background-color: #f7eee5;">
  93. <div id="mb"><span> 米白 </span></div>
  94. </div>
  95. <div class="bk-container" style="background-color: #e9dfc7;">
  96. <div id="zz"><span> 纸张 </span></div>
  97. </div>
  98. <div class="bk-container" style="background-color: #a4a4a4;">
  99. <div id="qh"><span> 浅灰 </span></div>
  100. </div>
  101. <div class="bk-container" style="background-color: #cdefce;">
  102. <div id="hy"><span> 护眼 </span></div>
  103. </div>
  104. <div class="bk-container" style="background-color: #283548;">
  105. <div id="hl"><span> 海蓝 </span></div>
  106. </div>
  107. </div>
  108. </div>
  109. </div>
  110. <!-- 目录 -->
  111. <div class="muluBox" id="mulu_Box" style="display: none;">
  112. <div class="muluMask" id="mulu_Mask">
  113. </div>
  114. <div class="muluCons" id="mulu_Cons">
  115. <div class="title"
  116. style="margin-bottom: 25px;display: flex;justify-content: space-between;align-items: center;">
  117. <div>共<span id="ChapterTotal"></span>章</div>
  118. <div>倒叙/正序</div>
  119. </div>
  120. <div class="mui-content">
  121. <ul id="muluList" class="mui-table-view mui-table-view-chevron">
  122. </ul>
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. <script src="js/mui.min.js"></script>
  129. <script type="text/javascript" src="js/jquery.min.js"></script>
  130. <script type="text/javascript" src="js/jquery.jsonp.js"></script>
  131. <script type="text/javascript" src="js/jquery.base64.js"></script>
  132. <script>
  133. //移动设备的高度
  134. let deviceHeight = document.documentElement.clientHeight;
  135. // $('.container').css('height', deviceHeight+'px')
  136. //
  137. var Dom = {
  138. font_Pop: $("#font_Pop"),
  139. nav_top: $("#nav_top"),
  140. nav_bottom: $("#nav_bottom"),
  141. icon_Aa: $("#icon_Aa"),
  142. body: $("body"),
  143. win: $(window),
  144. icon_yejian: $("#icon_yejian"),
  145. btn_Big: $("#btn_Big"),
  146. btn_Small: $("#btn_Small"),
  147. icon_mulu: $("#icon_mulu"),
  148. mulu_Box: $("#mulu_Box"),
  149. mulu_Mask: $("mulu_Mask"),
  150. mulu_Cons: $("#mulu_Cons"),
  151. muluList: $("#muluList")
  152. }
  153. //数据层的初始化
  154. var RootContainer = $('.Content');
  155. var readerUIFrame = ReaderBaseFrame(RootContainer);
  156. var readerMuluFrame = ReaderMuluFrame(Dom.muluList)
  157. var File_id = 0;
  158. var Chapter_id = 0;
  159. var ChapterTotal = 0;
  160. var ChapterList = [];
  161. var readerm = ReaderModel();
  162. readerm.init(function(data, mulu) {
  163. readerUIFrame(data);
  164. ChapterList = mulu;
  165. readerMuluFrame(mulu);
  166. });
  167. //业务事件的初始化
  168. EventHandler();
  169. var Util = (function() { //封装的本地存储和json数据解析
  170. var prefix = 'function_reader_';
  171. var StorageGetter = function(key) {
  172. return localStorage.getItem(prefix + key);
  173. }
  174. var StorageSetter = function(key, val) {
  175. return localStorage.setItem(prefix + key, val);
  176. }
  177. //通过url来获取加密信息,并解密
  178. var getJsonp = function(url, callback) {
  179. return $.jsonp({
  180. url: url,
  181. cache: true,
  182. callback: 'duokan_fiction_chapter',
  183. success: function(result) {
  184. //获取加密信息,解码、转json
  185. var data = $.base64.decode(result);
  186. var json = decodeURIComponent(escape(data));
  187. callback(json);
  188. }
  189. })
  190. }
  191. return {
  192. getJsonp: getJsonp,
  193. StorageGetter: StorageGetter,
  194. StorageSetter: StorageSetter
  195. }
  196. })();
  197. //背景颜色 存储记录
  198. var bkgroundcolor = Util.StorageGetter("bkgroundcolor");
  199. var bkCurrColor = Util.StorageGetter("bkgroundcolor");
  200. Dom.body.css('background-color', bkgroundcolor);
  201. //字号大小 设置存储记录
  202. var InitFontSize;
  203. InitFontSize = Util.StorageGetter("font_size");
  204. InitFontSize = parseInt(InitFontSize);
  205. if (!InitFontSize) {
  206. InitFontSize = 18;
  207. }
  208. $("p").css('font-size', InitFontSize);
  209. function ReaderBaseFrame(container) { //UI渲染层
  210. function ParseChapterData(jsonData) { //生成要展示的 html文本
  211. let jsonObj = jsonData;
  212. let html = "<h4>" + jsonObj.t + "</h4>";
  213. if (jsonObj.ct) {
  214. let hLevel = 4;
  215. for (let i = 0; i < jsonObj.ct.length; i++) {
  216. hLevel -= 1;
  217. html += `<h${hLevel}>${jsonObj.ct[i]}</h${hLevel}><br/>`;
  218. }
  219. }
  220. for (let i = 0; i < jsonObj.p.length; i++) {
  221. if (Chapter_id == 0) {
  222. html += "<div>" + jsonObj.p[i] + "</div>";
  223. } else {
  224. html += "<p>" + jsonObj.p[i] + "</p>";
  225. }
  226. }
  227. html = html.replace("##", )
  228. return html;
  229. }
  230. return function(data) { //返回 渲染后的结果data:解密后的json数据
  231. container.html(ParseChapterData(data));
  232. }
  233. }
  234. function ReaderMuluFrame(container) { //目录UI渲染层
  235. function ParseChapterMuluData(jsonData) { //生成要展示的 html文本
  236. let mulu = '';
  237. for (let i = 0; i < jsonData.length; i++) {
  238. let jsonObj = jsonData[i];
  239. if (jsonObj.children) {
  240. mulu +=
  241. `<li class="mui-table-view-cell mui-collapse parentLi"><a class="mui-navigate-right list-li-a" data-id="${jsonObj.chapter_id}" href="#">${jsonObj.title}</a><ul class="mui-table-view mui-table-view-chevron">`;
  242. for (let k = 0; k < jsonObj.children.length; k++) {
  243. mulu += `<li class="mui-table-view-cell"><a class="mui-navigate-right list-li-a" data-id="${jsonObj.children[k].chapter_id}" href="#">
  244. ${jsonObj.children[k].title}</a></li>`;
  245. }
  246. mulu += '</ul></li>';
  247. } else {
  248. mulu += `<li class="mui-table-view-cell parentLi"><a class="mui-navigate-right list-li-a" data-id="${jsonObj.chapter_id}" href="#">${jsonObj.title}
  249. </a></li>`;
  250. }
  251. }
  252. mulu = mulu.replace("##", );
  253. return mulu;
  254. }
  255. return function(data) { //返回 渲染后的结果data:解密后的json数据
  256. container.html(ParseChapterMuluData(data));
  257. }
  258. }
  259. function ReaderModel() { //数据交互层
  260. //todo 获取章节信息
  261. var init = function(Uicallback) { //初始化 信息
  262. getFictionInfo(function(mulu) {
  263. getCurChaptInfo(Chapter_id, function(data) {
  264. //todo
  265. Uicallback && Uicallback(data, mulu);
  266. })
  267. })
  268. };
  269. var getFictionInfo = function(callback) { //获取所有章节摘要信息
  270. $.get('data/chapter.json', function(data) {
  271. //todo 获取章节信息之后的回调
  272. Chapter_id = parseInt(Util.StorageGetter("ChapterId"));
  273. File_id = parseInt(Util.StorageGetter("FileId"));
  274. let list = data.chapters;
  275. for (let i = 0; i < list.length - 1; i++) {
  276. if (!isFinite(Chapter_id) && list[i].type !== 'file') {
  277. Chapter_id = list[i].chapter_id;
  278. File_id = list[i].file_id
  279. }
  280. if (list[i].children) {
  281. ChapterTotal += list[i].children.length
  282. if (!isFinite(Chapter_id)) {
  283. Chapter_id = list[i].children[0].chapter_id;
  284. File_id = list[i].children[0].file_id
  285. }
  286. }
  287. }
  288. callback && callback(list);
  289. }, 'json');
  290. };
  291. var getCurChaptInfo = function(Chapter_id, callback) { //获取当前Chapter_id章节详细信息
  292. $.get('data/data' + Chapter_id + '.json', function(data) {
  293. //todo 获取详细信息之后的回调
  294. if (data.result == 0) {
  295. // var url=data.jsonp;
  296. // Util.getJsonp(url,function(data){
  297. callback && callback(data);
  298. $("#ChapterTitle").text(data.t);
  299. // });//通过url来获取加密信息,并解密
  300. }
  301. }, 'json');
  302. };
  303. var prveChapter = function() { //上一页
  304. Chapter_id = parseInt(Chapter_id);
  305. if (Chapter_id == 0) {
  306. return;
  307. }
  308. Chapter_id -= 1;
  309. //调用方法获取 Chapter_id章节信息
  310. getCurChaptInfo(Chapter_id, function(data) {
  311. readerUIFrame(data); //渲染html数据
  312. });
  313. Util.StorageSetter("ChapterId", Chapter_id);
  314. //
  315. for (let item of ChapterList) {
  316. if (item.type === 'file') {
  317. let obj = item.children.find(child => child.chapter_id == Chapter_id)
  318. if (obj) {
  319. File_id = obj.file_id
  320. break;
  321. }
  322. } else {
  323. if (Chapter_id === item.chapter_id) {
  324. File_id = item.file_id
  325. break;
  326. }
  327. }
  328. }
  329. Util.StorageSetter("FileId", File_id);
  330. };
  331. var nextChapter = function() { //下一页
  332. Chapter_id = parseInt(Chapter_id);
  333. if (Chapter_id == ChapterTotal) {
  334. return;
  335. }
  336. Chapter_id += 1;
  337. //调用方法获取 Chapter_id章节信息
  338. getCurChaptInfo(Chapter_id, function(data) {
  339. //console.log(data);
  340. readerUIFrame(data);
  341. });
  342. Util.StorageSetter("ChapterId", Chapter_id);
  343. //
  344. for (let item of ChapterList) {
  345. console.log(item, 'item', Chapter_id)
  346. if (item.type === 'file') {
  347. let obj = item.children.find(child => child.chapter_id == Chapter_id)
  348. if (obj) {
  349. File_id = obj.file_id
  350. break;
  351. }
  352. } else {
  353. if (Chapter_id === item.chapter_id) {
  354. File_id = item.file_id
  355. break;
  356. }
  357. }
  358. }
  359. Util.StorageSetter("FileId", File_id);
  360. };
  361. var jumpChapter = function() { //跳页
  362. Chapter_id = parseInt(Chapter_id);
  363. if (Chapter_id == 0) {
  364. return;
  365. }
  366. Chapter_id -= 1;
  367. //调用方法获取 Chapter_id章节信息
  368. getJumpChapterInfo(Chapter_id, function(data) {
  369. //console.log(data);
  370. readerUIFrame(data); //渲染html数据
  371. });
  372. Unit.StorageSetter("ChapterId", Chapter_id);
  373. };
  374. return {
  375. init: init,
  376. prveChapter: prveChapter,
  377. nextChapter: nextChapter,
  378. jumpChapter: jumpChapter,
  379. }
  380. }
  381. function EventHandler() { //业务事件处理层
  382. //点击主体中间事件
  383. $("#action_mid").click(function() {
  384. if (Dom.nav_top.css('display') == "none") {
  385. Dom.nav_top.show();
  386. Dom.nav_bottom.show();
  387. } else {
  388. Dom.nav_top.hide();
  389. Dom.nav_bottom.hide();
  390. Dom.font_Pop.hide();
  391. Dom.icon_Aa.css('border', '');
  392. Dom.icon_yejian.css('border', '');
  393. Dom.mulu_Box.hide();
  394. Dom.mulu_Mask.hide();
  395. Dom.mulu_Cons.hide();
  396. Dom.icon_mulu.css('border', '');
  397. }
  398. });
  399. //点击返回事件
  400. // $("#nav_text").click(function(){
  401. // window.location = "./pages/bookstand.html";
  402. // });
  403. $(".nav_back_book").click(function() {
  404. window.location = "./pages/bookstand.html";
  405. });
  406. //点击目录事件
  407. $(".icon_mulu").click(function() {
  408. if (Dom.mulu_Box.css('display') == 'none') {
  409. Dom.icon_mulu.css('border', '1px solid #FF7800');
  410. Dom.mulu_Box.show();
  411. Dom.nav_top.hide();
  412. Dom.mulu_Mask.show();
  413. Dom.mulu_Cons.show();
  414. //章节总数赋值
  415. $('#ChapterTotal').text(ChapterTotal)
  416. //给当前选中章节高亮
  417. let optDom = $(".parentLi")[File_id];
  418. $(optDom).addClass("mui-active")
  419. $($(optDom).find("a")).each((i, aNode) => {
  420. if ($(aNode).data('id') == Chapter_id) {
  421. $(aNode).addClass("highChapter")
  422. } else {
  423. $(aNode).removeClass("highChapter")
  424. }
  425. })
  426. } else {
  427. Dom.icon_mulu.css('border', '');
  428. Dom.mulu_Box.hide();
  429. Dom.mulu_Mask.hide();
  430. Dom.mulu_Cons.hide();
  431. muludDelActive();
  432. }
  433. Dom.icon_Aa.css('border', '');
  434. Dom.font_Pop.hide();
  435. });
  436. //点击字体事件
  437. $(".btn_Aa").click(function() {
  438. if (Dom.font_Pop.css('display') == 'none') {
  439. Dom.icon_Aa.css('border', '1px solid #FF7800');
  440. Dom.font_Pop.show();
  441. } else {
  442. Dom.icon_Aa.css('border', '');
  443. Dom.font_Pop.hide();
  444. }
  445. Dom.icon_mulu.css('border', '');
  446. Dom.mulu_Box.hide();
  447. Dom.mulu_Mask.hide();
  448. Dom.mulu_Cons.hide();
  449. });
  450. //点击夜间事件
  451. $(".btn-yejian").click(function() {
  452. if (Dom.body.css('background-color') != "rgb(40, 53, 72)") {
  453. bkCurrColor = '#283548';
  454. //$(".bkColor").find('.bk-container-current')[0].className='';
  455. Dom.body.css('background-color', bkCurrColor);
  456. Dom.icon_yejian.css('border', '1px #FF7800 solid');
  457. $("#hl").addClass('bk-container-current');
  458. } else {
  459. bkCurrColor = '#e9dfc7';
  460. Dom.body.css('background-color', bkCurrColor);
  461. Dom.icon_yejian.css('border', '');
  462. $("#hl").removeClass('bk-container-current');
  463. $("#mb").addClass('bk-container-current');
  464. }
  465. Util.StorageSetter("bkgroundcolor", bkCurrColor);
  466. });
  467. //滚动条事件
  468. Dom.win.scroll(function() {
  469. Dom.nav_top.hide();
  470. Dom.nav_bottom.hide();
  471. Dom.font_Pop.hide();
  472. Dom.mulu_Box.hide();
  473. Dom.mulu_Mask.hide();
  474. Dom.mulu_Cons.hide();
  475. Dom.icon_Aa.css('border', '');
  476. Dom.icon_yejian.css('border', '');
  477. Dom.icon_mulu.css('border', '');
  478. })
  479. //点击 大、小事件
  480. Dom.btn_Big.click(function() {
  481. if (InitFontSize >= 20) {
  482. return;
  483. }
  484. InitFontSize += 1;
  485. console.log(InitFontSize);
  486. $("p").css('font-size', InitFontSize);
  487. Util.StorageSetter("font_size", InitFontSize);
  488. });
  489. Dom.btn_Small.click(function() {
  490. if (InitFontSize <= 12) {
  491. return;
  492. }
  493. InitFontSize -= 1;
  494. console.log(InitFontSize);
  495. $("p").css('font-size', InitFontSize);
  496. Util.StorageSetter("font_size", InitFontSize);
  497. });
  498. //点击背景颜色切换
  499. $(".bk-container").bind('click', function() {
  500. if ($(".bkColor").find('.bk-container-current').length > 0) {
  501. $(".bkColor").find('.bk-container-current')[0].className = '';
  502. } else {
  503. }
  504. var id = this.firstElementChild.id;
  505. $("#" + id).addClass('bk-container-current');
  506. switch (id) {
  507. case 'mb':
  508. Dom.body.css('background-color', '#f7eee5');
  509. break;
  510. case 'zz':
  511. Dom.body.css('background-color', '#e9dfc7');
  512. break;
  513. case 'qh':
  514. Dom.body.css('background-color', '#a4a4a4');
  515. break;
  516. case 'hy':
  517. Dom.body.css('background-color', '#cdefce');
  518. break;
  519. case 'hl':
  520. Dom.body.css('background-color', '#283548');
  521. break;
  522. default:
  523. break;
  524. }
  525. Util.StorageSetter("bkgroundcolor", Dom.body.css('background-color'));
  526. });
  527. $("#btn_prev").click(function() {
  528. readerm.prveChapter();
  529. });
  530. $("#btn_next").click(function() {
  531. readerm.nextChapter();
  532. });
  533. }
  534. function muludDelActive() {
  535. $(".parentLi").each((i, liNode) => {
  536. console.log(liNode, 'li')
  537. $(liNode).removeClass("mui-active")
  538. $($(liNode).find("a")).each((k, aNode) => {
  539. console.log(aNode, 'aNode', )
  540. $(aNode).removeClass("highChapter")
  541. })
  542. })
  543. }
  544. </script>
  545. </body>
  546. </html>