$(function(){ var Cookie = { /** * 获取指定名称的Cookie值 * @param {string} name - Cookie名称 * @returns {string|null} - 返回Cookie值,如果不存在则返回null */ get: function(name){ var carr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); if (carr != null){ return decodeURIComponent(carr[2]); } return null; }, /** * 设置Cookie * @param {string} name - Cookie名称 * @param {string} value - Cookie值 * @param {number} expires - 过期时间(以毫秒为单位) * @param {string} path - Cookie路径 * @param {string} domain - Cookie域 */ set:function(name, value, expires, path, domain){ if(expires){ expires = new Date(+new Date() + expires); } var tempcookie = name + '=' + escape(value) + ((expires) ? '; expires=' + expires.toGMTString() : '') + ((path) ? '; path=' + path : '') + ((domain) ? '; domain=' + domain : ''); //Ensure the cookie's size is under the limitation if(tempcookie.length < 4096) { document.cookie = tempcookie; } }, /** * 清除指定名称的Cookie * @param {string} name - Cookie名称 * @param {string} path - Cookie路径 * @param {string} domain - Cookie域 */ clear: function (name, path, domain) { if (this.get(name)) { document.cookie = name + "=" + ((path) ? "; path=" + path : "; path=/") + ((domain) ? "; domain=" + domain : "") + ";expires=Fri, 02-Jan-1970 00:00:00 GMT"; } } }; // 从页面中读取阅读设置选项 var $settings = $("#pageReadOpt") var data = { isLogin: book.uid, // 用户是否登录 isPublish: $settings.data("book-publish") == "0" ? 0 : 1, // 书籍是否已发布 salesMode: $settings.data("sale-modes") == "2" ? 1 : 0, // 销售模式 hasSub: $settings.data("has-sub") == "0" ? 0 : 1, // 是否有订阅 settingsStr: $settings.data("settingsStr"), // 设置字符串(可能包含阅读配置) chapterUrl: book.chapterUrl, // 当前章节的URL endUrl: book.url, // 书籍结束时的URL book: book.Info, // 书籍信息 chapters: (function() { var chapters = {}; chapters[book.chapter.id] = book.chapter; // 初始化章节数据 return chapters; })(), chapter: book.chapter, // 当前章节信息 scrollLastChapter: book.chapter, // 上次滚动到的章节 lastOfflineChapterId: null, // 最近离线章节的ID isInBookShelf: 0, // 是否在书架中 catalog: null // 书籍目录 }; /** * 检查是否处于离线状态 * @returns {boolean} - 如果离线则返回true,否则返回false */ var isOffline = function() { return navigator && navigator.onLine === false; }; /** * Book对象,包含书籍阅读相关的功能 */ var Book = { // 初始化书籍阅读功能 init: function () { var that = this; that.winHeight = $(window).height(); // 获取窗口高度 that.forbidCopy(); // 禁止复制、剪切和右键功能 this.initOptionsLayer(); // 初始化选项层 this.initCatalogAside(); // 初始化目录 this.initChapterProgress(); // 初始化章节进度 this.initFontSizeSetting(); // 初始化字体大小设置 this.initSkinSetting(); // 初始化皮肤设置 this.initModeSetting(); // 初始化阅读模式设置 this.initDayNightSetting(); // 初始化日夜模式切换 this.initModes(); // 初始化阅读模式(滚动/滑动) if ($("#pageRead").hasClass("H")) { this.swipeReader.enable(); // 启用滑动阅读模式 } else { this.scrollReader.enable(); // 启用滚动阅读模式 } }, /* * 禁止页面选中文字、copy、右键功能 * @method forbidCopy */ forbidCopy: function () { //禁止copy $('body').on('copy', function () { return false; }); //禁止cut $('body').on('cut', function () { return false; }); //禁止鼠标右键默认弹窗 $('body').on('contextmenu', function () { return false; }); }, // 初始化选项层 initOptionsLayer: function() { var $layer = $("#pageReadOpt"); var $settingsMenu = $("#readBtnMore"); $layer.on({ click: function(event) { var target = event.target; if (target !== this || target.avoidClick) { return; } var $activeLayer = $layer.find(".jsLayerTrigger.active"); if ($activeLayer.length) { $activeLayer.trigger("click"); } $layer.removeClass("active"); }, touchstart: function(event) { this.flagMoveHide = event.target === this; }, touchmove: function(event) { if (this.flagMoveHide) { $layer.trigger("click"); } event.preventDefault(); } }); new Toggle($settingsMenu); var $layerTrigger = $(".jsLayerTrigger"); $layerTrigger.on("click", function(event) { var self = this; if (event && (event.isTrusted === false || event.hasOwnProperty("_args") || event.pageY === 0 && event.screenY === 0)) { return; } $layerTrigger.each(function() { var $this = $(this); if (this !== self && $this.hasClass("active")) { $this.trigger("click"); } }); }); }, // 初始化目录 initCatalogAside: function() { var self = this; $("#readBtnChapter").aside({ scrollable: "#catelogX", onInit: function() { var aside = this; //var layer_index=layer.open({type: 2,content: '加载中'}); // $.ajax({ type : "get", url : "/home/chapter/lists", // data : {id: data.book.Id}, // async : false, // success : function(result){ // layer.close(layer_index); // $("#asideChapterContent").html(result); // $("#asideChapterContent").on("click", ".jsChapter a", function(event) { // event.preventDefault(); // aside.hide(); // $("#pageReadOpt").trigger("click"); // self.jumpChapter($(this).data("chapter-id"), true); // }); // } // }); }, onShow: function() { var nowChapterId = data.chapter.id,chapterDom = $('[data-chapter-id="'+nowChapterId+'"]'); $('#catelogX').find('.chapter-index.red').removeClass('red'); chapterDom.find('.chapter-index').addClass('red'); $('#catelogX').scrollTop(0).scrollTop(chapterDom.offset().top - $('#catelogX').offset().top); } }); }, // 初始化章节进度 initChapterProgress: function() { var self = this; var $toggle = $("#readBtnProg"); var range; var chapterIds = []; var chapters = {}; function refresh(chapterId) { var chapterIndex = chapterIds.indexOf(chapterId); if (chapterIndex < 0) { chapterIndex = 0; chapterId = chapterIds[chapterIndex]; } var chapterName = chapters[chapterId]; var $currentChapter = $("#readProgVal"); $currentChapter.find("h4").html(chapterName); $currentChapter.find("output").html((chapterIndex * 100 / chapterIds.length).toFixed(1) + "%"); } function init(result) { $(result).find('.chapter-li-a').each(function(){ var chapter_id = $(this).data('chapter-id'); chapterIds.push(chapter_id); chapters[chapter_id] = $(this).text(); }); refresh(data.chapter.id); var $chapterProgressRange = $("#readProgRange"); $chapterProgressRange.attr("max", chapterIds.length - 1); $chapterProgressRange.val(chapterIds.indexOf(data.chapter.id)); $chapterProgressRange.on("change", function() { var chapterId = chapterIds[this.value]; refresh(chapterId); }); range = new Range($chapterProgressRange, { shadow: true, buttons: [ "#readProgPrev", "#readProgNext" ], onChangeEnd: function() { var chapterId = chapterIds[$chapterProgressRange.val()]; self.jumpChapter(chapterId, true); }, }); range.shadow(); } new Toggle($toggle, { callback: function() { if (range) { range.value(chapterIds.indexOf(data.chapter.id)); range.shadow(); } } }); $toggle.one("click", function() { if ($('catelogX').length != 0) { init($('#asideChapterContent').html()); } else { var $el = $("#readOptProg").css("opacity", 0); var layer_index=layer.open({type: 2,content: '加载中'}); $.getJSON("/home/chapter/lists", { id: data.book.Id }, function(result) { layer.close(layer_index); $el.css("opacity", 1); init(result); }); } }); }, // 初始化字体大小设置 initFontSizeSetting: function() { var self = this; var $toggle = $("#readBtnSet"); var $range = $("#readFontRange"); var $chapterContent = $("#chapterContent"); var lazyHandler = debounce(function(val, e) { self.scrollReader.refresh(); self.swipeReader.refresh(); self.updateSettings({ fs: val }); }, 300); new Toggle($toggle); new Range($range, { buttons: [ "#readFontDown", "#readFontUp" ] }); $range.on("change", function(e) { var val = this.value; var rem = (val * 2 + 12) / 16; $chapterContent.css("font-size", rem + "rem"); lazyHandler(val, e); }); }, // 初始化皮肤设置 initSkinSetting: function() { var self = this; var $body = $("body"); var $dn = $("#readBtnMode"); // 获取日夜模式按钮 var lazyHandler = debounce(function(val) { self.updateSettings({ skin: val // 更新皮肤设置 }); }, 300); // 防抖处理,延迟300ms执行 $("#readSetSkin").on("click", '[type="radio"]', function(){ var $this = $(this); $body.removeClass("read-night"); // 移除夜间模式 $body.attr("class", $body.attr("class").replace(/skin-[a-z]+/g, "skin-" + $this.val())); // 替换皮肤样式 if ($dn.data("mode") === "day") { $dn.trigger("click"); // 如果是白天模式,触发点击切换 } lazyHandler($this.data("index")); // 调用防抖函数更新皮肤 }); }, // 更新阅读设置 initModeSetting: function() { var self = this; var lazyHandler = debounce(function(val){ self.updateSettings({ vh: val }); }, 300); $("#readSetLayout").on("click", '[type="radio"]', function() { if (this.value === "v") { $("#pageRead").removeClass("H"); self.scrollReader.enable(); self.swipeReader.disable(); self.jumpChapter(data.chapter.id); } else { $("#pageRead").addClass("H"); self.scrollReader.disable(); self.swipeReader.enable(); self.jumpChapter(data.chapter.id); } lazyHandler(this.value); }); }, // 初始化日夜模式切换 initDayNightSetting: function() { var self = this; var $body = $("body"); var $btn = $("#readBtnMode"); var $title = $btn.find("h4"); var DAY = "day"; var NIGHT = "night"; var lazyHandler = debounce(function(val) { self.updateSettings({ dn: val }); }, 300); $btn.on("click", function() { var mode = $btn.data("mode"); if (mode === DAY) { $btn.data("mode", NIGHT); $title.html($title.html().replace("日", "夜")); $body.removeClass("read-night"); var skin = $body.attr("class").match(/skin-([a-z]+)/); if (skin) { skin = skin[1]; $('#readSetSkin [type="radio"][value="' + skin + '"]').prop("checked", true); } lazyHandler("d"); } else if (mode === NIGHT) { $btn.data("mode", DAY); $title.html($title.html().replace("夜", "日")); $body.addClass("read-night"); $('#readSetSkin [type="radio"]').each(function() { var $this = $(this); if ($this.prop("checked")) { $this.prop("checked", false); } }); lazyHandler("n"); } }); }, // 初始化阅读模式(滚动/滑动) initModes: function() { var self = this; var $goEnd = $("#aGotoBookEnd"); // 当前章节id function isChapterShown(chapterId) { return $(".jsChapterWrapper").map(function() { return $(this).data("chapter-id"); }).indexOf(chapterId) > -1; } var scrollReader = this.scrollReader = new ScrollReader({ wrapperSelector: "#readContent", prevSelector: "#readLoadPrev", nextSelector: "#readLoadNext", nextTriggerSelector: "#btnLoadNextChapter", markSelector: "#readPageMark", onPrevClick: function(e) { //点击向前滚动 }, onCenterClick: function() { $settings[0].avoidClick = true; setTimeout(function() { $settings[0].avoidClick = false; }, 500); $settings.addClass("active"); }, onNextClick: function(e) { //点击向后滚动 }, onScroll: function(y) { var isViewportChapterId; scrollReader.$wrapper.find(".jsChapterWrapper").each(function() { if (isViewportChapterId) { return; } var $this = $(this); var offset = $this.offset(); if (offset.top < y && offset.top + offset.height > y) { isViewportChapterId = $this.data("chapter-id"); } }); if (isViewportChapterId) { self.setReadChapter(isViewportChapterId); } }, onScrollPrev: function(resolve, reject) { var chapterId = data.chapter.prevId; if (chapterId) { self.jumpChapter(chapterId, false, resolve, reject); } else { layer.open({content:'已经是第一章了',skin:'msg',time:2}); reject(); } }, onScrollNext: function(resolve, reject) { var chapterId = data.scrollLastChapter.nextId; if (chapterId) { self.getChapter(chapterId, false, function(result) { data.scrollLastChapter = result.data.chapterInfo; if (!isChapterShown(chapterId)) { $("#chapterContent").append('

'+result.data.chapterInfo.title+'

'+result.data.chapterInfo.content+'
'); if (data.scrollLastChapter.nextId) { scrollReader.$nextTrigger.show(); $goEnd.hide(); } else { scrollReader.$nextTrigger.hide(); $goEnd.show(); } resolve(); } else { reject(); } }, reject); } }, onWillScrollNext: function(resolve, reject) { var chapterId = data.scrollLastChapter.nextId; if (chapterId && !(data.scrollLastChapter.vipStatus && $("#swiChk1").prop("checked"))) { self.getChapter(chapterId, false, function(result) { data.scrollLastChapter = result.data.chapterInfo; if (!isChapterShown(chapterId)) { $("#chapterContent").append('

'+result.data.chapterInfo.title+'

'+result.data.chapterInfo.content+'
'); if (data.scrollLastChapter.nextId) { scrollReader.$nextTrigger.show(); $goEnd.hide(); } else { scrollReader.$nextTrigger.hide(); $goEnd.show(); } resolve(); } else { reject(); } }, reject); } else { reject(); } } }); this.swipeReader = new SwipeReader({ wrapperSelector: "#readContent", scrollerSelector: ".jsChapterWrapper", pagerSelector: "#pageNum", onCenterClick: function() { $settings[0].avoidClick = true; setTimeout(function() { $settings[0].avoidClick = false; }, 500); $settings.addClass("active"); }, onSwipePrev: function(resolve, reject) { var chapterId = data.chapter.prevId; if (chapterId) { self.jumpChapter(chapterId, false, resolve, reject); } else { layer.open({content:'已经是第一章了',skin:'msg',time:2}); reject(); } }, onSwipeNext: function(resolve, reject) { var chapterId = data.chapter.nextId; if (chapterId) { self.jumpChapter(chapterId, false, resolve, reject); }else{ location.href = data.endUrl; } }, onWillSwipeNext: function(resolve, reject) { var chapterId = data.chapter.nextId; if (chapterId) { self.getChapter(chapterId, false, resolve, reject); } else { reject(); } } }); }, // 开始章节 jumpChapter: function(chapterId, isShowLoading, resolve, reject) { var self = this; if (!history.replaceState) { location.href = data.chapterUrl.replace("chapterId", chapterId); } else { self.getChapter(chapterId, isShowLoading, function(result) { var chapter = result.data.chapterInfo; data.chapter = data.scrollLastChapter = chapter; if (chapter.nextId) { $("#btnLoadNextChapter").show(); $("#aGotoBookEnd").hide(); } else { $("#btnLoadNextChapter").hide(); $("#aGotoBookEnd").show(); } $("#chapterTitle").html(chapter.title); $("#chapterContent").html('

'+chapter.title+'

'+chapter.content+'
'); self.updateReadProgress(); history.replaceState(null, null, data.chapterUrl.replace("chapterId", chapterId)); if ($.isFunction(resolve)) { resolve(); } else if (self.scrollReader.enabled) { self.scrollReader.restart(); } else if (self.swipeReader.enabled) { self.swipeReader.restart(); } }, reject || function() {}); } }, updateSettings: function(settings) { $.each(settings, function(key, value) { data.settingsStr = data.settingsStr.replace(new RegExp(key + ":[^|]+"), key + ":" + value); }); var settingsStr = data.settingsStr.replace(/[^:|]+:/g, ""); Cookie.set('reader_config_wap', settingsStr, 86400000 * 365, '/'); }, updateReadProgress: function() { if (isOffline()) { return; } if(!data.isLogin){ return; } //更新阅读记录 // $.get("/user/Chapter/UpdRead", { // bookId: data.book.bookId, // chapterId: data.chapter.chapterId, // chapterName: data.chapter.chapterName // }); }, getChapter: function(chapterId, isShowLoading, resolve, reject) { var self = this; var layer_index; if (isOffline()) { $("#readLoadNext").css("opacity", 1); } if (data.chapters[chapterId]) { resolve({ data: { bookInfo: data.book, chapterInfo: data.chapters[chapterId] } }); } else { if (isOffline()) { if (data.chapter.chapterId === data.lastOfflineChapterId) { $("#readLoadNext").css("opacity", 0); layer.open({content:'已显示全部离线章节',skin:'msg',time:2}); } return reject(); } if (isShowLoading) { layer_index=layer.open({type: 2,content: '加载中'}); } $.getJSON("/home/chapter/info", {id: book.chapter.source_id , key: chapterId}, function(result) { if (isShowLoading) { layer.close(layer_index); } if (result.code === 1) { var chapter = { id : result.data.chapter.id, title:result.data.chapter.title, vipStatus : 0, content : result.data.chapter.content, prevId : result.data.chapter.prev.id, nextId : result.data.chapter.next.id }; data.chapters[chapter.id] = chapter; data.book = { "Id": result.data.id, "Name": result.data.title, "authorName": result.data.author }; resolve({ data: { bookInfo: data.book, chapterInfo: chapter } }); } else { if (isShowLoading) { layer.open({content:'获取章节内容失败,请稍候再试',skin:'msg',time:2}); } reject(); } }); } }, setReadChapter: function(chapterId) { var self = this; var chapter = data.chapters[chapterId]; if (!chapter || chapter.id === data.chapter.id) { return; } data.chapter = chapter; $("#chapterTitle").html(chapter.title); self.updateReadProgress(); history.replaceState(null, null, data.chapterUrl.replace("chapterId", chapterId)); } } Book.init(); });