基于markdown-it的自解析HTML页面添加时区显示功能失效的问题修复咨询
基于markdown-it的自解析HTML页面添加时区显示功能失效的问题修复咨询
嘿,我来帮你排查下这个问题的根源,以及给出可行的修复方案:
核心问题:页面内容被完全覆盖
你最初的markdown-it.js里有个关键操作:
document.querySelector('body').innerHTML = html;
这行代码会把整个<body>标签里的所有内容全部替换成markdown渲染后的结果——包括你后来添加的<p id="time-zones">元素和引入time-zones.js的脚本标签!这就导致时区脚本要么找不到目标元素,要么连脚本本身都被删掉了,自然没法正常运行。
另外你更新的代码里还犯了一个低级错误:你写了window.document.querySelector('noscript').markdownit(...),但markdownit是挂载在全局window对象上的函数,不是DOM元素的方法,这才会抛出TypeError: ...markdownit is not a function的错误。
两种可行的修复方案
方案一:只替换noscript标签,保留原有页面元素
修改你的markdown-it.js,不要替换整个body的内容,只把noscript标签替换成渲染后的markdown:
'use strict'; window.onload = function() { const noscriptEl = document.querySelector('noscript'); const markdown = noscriptEl.innerHTML; // 正确调用全局的markdownit函数 const md = window.markdownit({ html: true, linkify: false, typographer: true }); const html = md.render(markdown); // 替换noscript标签为渲染后的内容,保留body里的其他元素 noscriptEl.outerHTML = html; }
这样修改后,你添加的<p id="time-zones">和time-zones.js都会保留在页面中,脚本就能正常找到目标元素并渲染时区信息了。
方案二:整合时区逻辑到markdown渲染脚本中
如果你不想保留额外的脚本标签,可以把时区获取的逻辑直接整合到markdown-it.js里,在渲染markdown后把时区信息追加到内容末尾:
'use strict'; // 把window.onload改成async函数,因为要等待fetch请求 window.onload = async function() { const noscriptEl = document.querySelector('noscript'); const markdown = noscriptEl.innerHTML; const md = window.markdownit({ html: true, linkify: false, typographer: true }); let html = md.render(markdown); // 追加时区信息 try { const browserTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; const ipTimeZone = (await (await fetch(`https://ipapi.co/json`)).json()).timezone; html += `<p style="margin-top:1rem;">时区信息:${browserTimeZone} — ${ipTimeZone}</p>`; } catch ({ message }) { html += `<p style="margin-top:1rem; color:red;">获取时区失败:${message}</p>`; } // 现在替换整个body内容是安全的,因为已经把时区信息整合进去了 document.body.innerHTML = html; }
这种方案不需要额外的time-zones.js和<p id="time-zones">,所有逻辑都在一个脚本里完成,更简洁。
备注:内容来源于stack exchange,提问作者jsx97
相关产品推荐
相关产品推荐

