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];
});
相关推荐
水煮白菜王9 分钟前
高德地图"未获得商用授权"水印临时移除方案
前端·javascript
chushiyunen11 分钟前
vue el-pagination实现分页
javascript·vue.js·elementui
by————组态13 分钟前
Ricon组态可视化编辑器 - 所见即所得的工业画布
前端·javascript·物联网·架构·编辑器·组态
光影少年19 分钟前
react大列表优化:虚拟列表原理
前端·javascript·react.js
如烟花的信页34 分钟前
外贸*登录逆向分析
javascript·爬虫·python·js逆向
wanger611 小时前
Vue学习笔记
前端·javascript·vue.js
大大杰哥2 小时前
Vue2学习(3)--组件中的通信方式/组件之间的交互
java·前端·javascript
PixelBai2 小时前
JSON过滤使用教程:从入门到精通
javascript·chrome·json
阿猫的故乡2 小时前
Vue3自定义插件:封装一个全局消息提示插件,所有组件都能直接用
前端·javascript·vue.js
橘子星2 小时前
树与二叉树:从概念到 JavaScript 实现
前端·javascript·面试