JSZip库读取ePub电子书目录

目录保存在 toc.ncx 文件

javascript 复制代码
inputFile.addEventListener('change', function(e) {
    const file = e.target.files[0];
    if (!file) return;
       
    const reader = new FileReader();
    reader.onload = function(e) {
        const contents = e.target.result;
        JSZip.loadAsync(contents).then(function(zip) {            
            zip.forEach(function(path, entry) {
                if (!entry.dir) {					
                    if (path.endsWith('.html') || path.endsWith('.xhtml')) {
                       	......				
                    } else if (path == 'toc.ncx') {						
						entry.async('string').then(function(content) {                            
							genTOC(content);							
                        }).catch(function() {
                           
                        });	
					}
                }
            });
        });
    };
    reader.readAsArrayBuffer(file);
});

解析ncx文件获取章节名称和地址

https://www.cnblogs.com/linlf03/archive/2011/12/13/2286047.html

src 保存到 option.dataset

javascript 复制代码
function genTOC(content) {
	select.innerHTML = '';
	var parser = new DOMParser();
	var xmlDoc = parser.parseFromString(content, "text/xml");
	var navPoint = xmlDoc.getElementsByTagName('navPoint');
	for (i=0; i<navPoint.length; i++) {
		var label = navPoint[i].getElementsByTagName('navLabel')[0].getElementsByTagName('text')[0].textContent;		
		var src = navPoint[i].getElementsByTagName('content')[0].getAttribute('src');
		var option = document.createElement('option');
        option.textContent = label;
		option.dataset.src = src;
        select.appendChild(option);
	}
}

切换选项加载内容

src#分割,获取path和锚点,并跳转锚点。

javascript 复制代码
select.addEventListener('change', function(e) {
	var src = select.options[select.selectedIndex].dataset.src;	
	var srca = src.split('#');
    viewer.innerHTML = map.get(srca[0]);
	if (srca.length > 1)
		window.location.hash = srca[1];
});
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
午安~婉6 小时前
Electron桌面应用聊天(续)
前端·javascript·electron
哟哟耶耶7 小时前
vue3-单文件组件css功能(:deep,:slotted,:global,useCssModule,v-bind)
前端·javascript·css
是罐装可乐7 小时前
深入理解“句柄(Handle)“:从浏览器安全到文件系统访问
前端·javascript·安全
华科易迅7 小时前
Vue如何集成封装Axios
前端·javascript·vue.js
不是az7 小时前
CSS知识点记录
前端·javascript·css
昵称暂无18 小时前
.NET 高级开发 | i18n 原理、实现一个 i18n 框架
javascript·c#·.net
h_jQuery8 小时前
vue使用gm-crypto对数据进行sm4加密处理
前端·javascript·vue.js
阿赛工作室8 小时前
Vue中onBeforeUnmount不触发的解决方案
前端·javascript·vue.js
浩星9 小时前
electron系列1:Electron不是玩具,为什么桌面应用需要它?
前端·javascript·electron