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];
});
相关推荐
晗夜未央6 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
jktantan7 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
我命由我123457 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
程序员大阳8 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
paopaokaka_luck10 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
栀椩10 小时前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
SEO_juper10 小时前
Chrome 扩展一键查看当前页面 SEO 信息:不用切页面,点一下全出来
前端·javascript·chrome
Highcharts.js10 小时前
CSUN 2026|Highcharts无障碍数据与AI分享
javascript·人工智能·数据分析·highcharts·图表开发
系统集成-鹰翔10 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
小大宇11 小时前
Vue知识点-ElementPlus-05 输入框
前端·javascript·vue.js