
本文详细介绍了如何使用 Paged.js 结合 J*aScript 动态生成 HTML 文档的目录(Table of Contents),并自动填充页码。通过定制 Paged.js 的处理器,在内容解析前构建目录结构,然后利用 CSS target-counter 功能实现页码的自动显示,解决了在打印布局中获取元素页码的挑战。
在将 HTML 内容转换为可打印的文档时,生成一个带有准确页码的动态目录是一个常见需求。传统的做法是手动更新页码,但这在内容变动时效率低下且易出错。使用像 Paged.js 这样的工具可以自动化这一过程,但直接通过 J*aScript 或 jQuery 访问 DOM 元素来获取其在最终打印布局中的页码并非易事,因为页码是 Paged.js 渲染引擎在布局阶段计算出来的。
本文将深入探讨如何利用 Paged.js 的强大功能,通过其生命周期钩子和 J*aScript 编程,实现一个完全动态且带有页码的目录生成方案。
Paged.js 提供了一套生命周期钩子,允许开发者在文档处理的不同阶段介入。对于动态目录生成,最合适的钩子是 beforeParsed。在这个阶段,Paged.js 已经加载了 HTML 内容,但尚未进行布局和分页处理。这意味着我们可以在此时遍历文档中的标题元素,构建目录结构,并为它们添加必要的属性,为后续的页码显示做准备。
Paged.Handler 是 Paged.js 中用于扩展其功能的基类。通过创建一个继承自 Paged.Handler 的自定义类,并重写 beforeParsed 方法,我们可以在 Paged.js 开始解析内容之前执行自定义逻辑。
动态目录的构建主要通过一个 J*aScript 函数完成,该函数负责识别文档中的标题,为它们生成唯一的标识符(如果不存在),并构建一个链接到这些标题的目录列表。
首先,我们需要在 HTML 文档中定义标题元素和目录的占位符。标题应具有清晰的结构,例如使用
<!-- 文档中的标题 --> <h1 id="pre-digital_era" class="chapter-title" data-title-level="1"> 前数字时代 </h1> <p>此处是章节内容...</p> <h2 id="digital_era" class="chapter-title" data-title-level="2"> 数字时代 </h2> <p>此处是章节内容...</p> <!-- 目录占位符 --> <div id="my-toc-content"> <!-- 动态生成的目录将插入到这里 --> </div>
请注意,为标题添加 id 属性至关重要,因为目录中的链接( 标签的 href 属性)将指向这些 ID。如果标题没有 ID,我们的 J*aScript 函数会为其自动生成。
createToc 函数是实现动态目录的核心。它接收一个配置对象,包含内容的根元素、目录占位符的选择器以及标题元素的选择器数组。
野羊分类信息系统
===更新说明==解决了无法登陆后台的问题!完善了部分功能修复了一个BUG..修改静态模版说明:本系统的首页 和 内容页 不支持动态显示,需要生成HTML(实为.asp文件)模版文件存放在temp目录下index.html为首页模版show.html为内容页模版......=============2007 - 10 - 20 ===========注:1*使用前请务必修改 inc/conn.as
0
查看详情
function createToc(config) {
const content = config.content; // 文档内容根元素
const tocElementSelector = config.tocElement; // 目录占位符选择器
const titleElementsSelectors = config.titleElements; // 标题元素选择器数组
// 获取目录占位符元素,并创建一个无序列表作为目录容器
let tocElementDiv = content.querySelector(tocElementSelector);
let tocUl = document.createElement("ul");
tocUl.id = "list-toc-generated";
tocElementDiv.appendChild(tocUl);
// 遍历所有指定标题元素,确保它们有ID并添加辅助类
let tocElementNbr = 0;
for (let i = 0; i < titleElementsSelectors.length; i++) {
let titleHierarchy = i + 1; // 根据选择器数组的顺序确定层级
let titleElements = content.querySelectorAll(titleElementsSelectors[i]);
titleElements.forEach(function (element) {
// 添加通用类和层级数据属性
element.classList.add("title-element");
element.setAttribute("data-title-level", titleHierarchy);
// 如果元素没有ID,则生成一个唯一ID
tocElementNbr++;
if (element.id === "") {
element.id = "title-element-" + tocElementNbr;
}
});
}
// 根据已处理的标题元素创建目录列表项
let processedTocElements = content.querySelectorAll(".title-element");
for (let i = 0; i < processedTocElements.length; i++) {
let tocElement = processedTocElements[i];
let tocNewLi = document.createElement("li");
// 为目录列表项添加层级类
tocNewLi.classList.add("toc-element");
tocNewLi.classList.add(
"toc-element-level-" + tocElement.dataset.titleLevel
);
// 复制标题元素的其他类到目录列表项(可选)
let classTocElement = tocElement.classList;
for (let n = 0
; n < classTocElement.length; n++) {
if (classTocElement[n] !== "title-element") {
tocNewLi.classList.add(classTocElement[n]);
}
}
// 创建链接,href指向标题ID,文本内容为标题内容
tocNewLi.innerHTML =
'<a href="#' + tocElement.id + '">' + tocElement.innerHTML + "</a>";
tocUl.appendChild(tocNewLi);
}
}函数参数说明:
工作流程:
createToc 函数本身只是一个独立的 J*aScript 函数。为了让它在 Paged.js 处理文档时自动运行,我们需要将其封装在一个 Paged.Handler 中,并在 beforeParsed 钩子中调用它。
将以下代码添加到 HTML 文档的
部分,紧随 Paged.js 脚本之后:<script type="text/j*ascript" src="path/to/paged.polyfill.js"></script>
<script>
// ... createToc 函数定义 ...
class CustomTocHandler extends Paged.Handler {
constructor(chunker, polisher, caller) {
super(chunker, polisher, caller);
}
// 在 Paged.js 解析内容之前执行
beforeParsed(content) {
createToc({
content: content, // Paged.js 提供的文档内容根元素
tocElement: "#my-toc-content", // 目录占位符的选择器
titleElements: ["h1", "h2"], // 匹配 h1 和 h2 作为目录项
});
}
}
// 注册自定义处理器
Paged.registerHandlers(CustomTocHandler);
</script>在这个示例中,CustomTocHandler 是我们自定义的 Paged.js 处理器。在 beforeParsed 方法中,我们调用 createToc 函数,并传入 Paged.js 提供的 content 对象(代表了待处理的整个文档内容),以及目录占位符和标题选择器。
上述 J*aScript 代码完成了目录结构的构建,将标题链接到其对应的位置。然而,它并没有直接在目录中插入页码。页码的显示是 Paged.js 结合 CSS target-counter 功能来实现的。
target-counter() 是一个 CSS 函数,它允许你获取文档中某个元素在特定命名计数器(如 page 计数器)上的值。当与目录链接的 href 属性结合使用时,它就能显示链接目标元素的页码。
通常,你会在 CSS 中这样定义页码的显示:
@page {
/* 定义页码计数器 */
counter-increment: page;
@bottom-right {
content: counter(page); /* 在页面底部显示当前页码 */
}
}
/* 为目录列表项添加页码 */
.toc-element a::after {
content: target-counter(attr(href), page); /* 显示链接目标元素的页码 */
float: right; /* 将页码浮动到右侧 */
margin-left: 1em; /* 与标题文字保持距离 */
}通过这种 CSS 规则,当 Paged.js 渲染文档时,它会自动计算每个标题的页码,并通过 target-counter(attr(href), page) 将其注入到目录 标签的 ::after 伪元素中。
通过 Paged.js 的 beforeParsed 钩子和自定义 J*aScript 函数,我们可以高效地动态生成 HTML 文档的目录。J*aScript 负责构建目录的结构和链接,而 Paged.js 结合 CSS target-counter 则负责在打印布局中自动填充正确的页码。这种方法不仅解决了手动更新页码的痛点,也使得内容更新和布局调整变得更加灵活和自动化,极大地提升了可打印文档的生成效率和用户体验。
以上就是利用 Paged.js 动态生成带页码的目录的详细内容,更多请关注其它相关文章!
相关文章:
晋江读书网页版在线登录 晋江读书电脑版官网
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
微信客户端如何收红包_微信客户端接收红包使用教程
mysql如何分析事务日志_mysql事务日志分析方法
Win11怎么关闭快速启动_Win11彻底关机设置教程
机器学习中对数变换预测结果的反向还原
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
Go语言实现持久化与原子性文件存储的教程
c++如何使用Meson构建系统_c++比CMake更快的构建工具
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
优化Log4j2控制台输出性能:解决异步日志瓶颈
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
蛙漫官方正版入口 蛙漫网页在线全集免费观看
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
excel怎么提取文本中数字 excel函数提取技巧
Archive of Our Own官网直达 AO3最新可用地址一览
c++中为什么推荐使用using替代typedef_c++现代化类型别名
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
qq音乐在线播放入口_qq音乐电脑版登录链接
Go语言中高效处理x-www-form-urlencoded表单数据
蛙漫移动版在线看 蛙漫手机浏览器直达入口
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
邮政快递包裹最新位置 邮政快递实时追踪入口
狙击外星人小游戏开始_狙击外星人小游戏立即开始
汽车之家官方网站官网入口_汽车之家网页版直接进入
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
AO3中文官网链接_AO3网页版稳定镜像站
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
Mac怎么查看崩溃日志_Mac控制台错误报告分析
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
163邮箱注册官网 免费申请163个人邮箱
如何在 Windows 11 中启动游戏手柄设置
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
快手官方唯一登录入口 谨防山寨钓鱼网站
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题