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];
});
相关推荐
比特森林探险记2 小时前
Element Plus 实战指南
前端·javascript
FlyWIHTSKY2 小时前
Vue3 单文件中不同的组件
前端·javascript·vue.js
FlyWIHTSKY2 小时前
Vue 3 onMounted 中控制同步与异步执行策略
前端·javascript·vue.js
隔壁小邓2 小时前
vue的组件化的理解之单独拆分的组件&组件的封装
前端·javascript·vue.js
Ivanqhz2 小时前
图着色寄存器分配算法(Graph Coloring)
开发语言·javascript·python·算法·蓝桥杯·rust
我命由我123453 小时前
Element Plus 问题:选择框表单校验没有触发
开发语言·前端·javascript·html·ecmascript·html5·js
optimistic_chen3 小时前
【Vue3入门】vue-router 路由管理
前端·javascript·vue.js·路由·router
wuhen_n3 小时前
ESLint + Prettier + Husky + lint-staged:建立自动化的高效前端工作流
前端·javascript·vue.js
小同志003 小时前
HTML 基础
前端·javascript·html