ios浏览器单页模式高亮代码块消失

k
k
1月29日发布 /正在检测是否收录...

高亮代码块消失

Safari就是$[经典表情]::(便便)
PC和安卓正常,只苹果端开启单页模式后切换页面时会导致高亮代码块消失。
高亮代码快消失
如图所示,代码块高亮未正确显示,只显示了超出显示范围的文本内容,正确显示应该是以下图示
高亮代码块正常

原因所在

bug原因是因为此主题开启了Turbolinks单页模式,测试关闭后正常。
Safari 对动态插入的 pre和code 节点不会自动重算样式,导致样式缺失。

解决方案

由于“Joe二开主题再续前缘版”开发者是个🐔,此主题bug一堆不修复,只能菜鸟本人上了。
用最笨的方式针对bug解决bug,也就是搞个补丁,使其页面在载入时强制加载prism资源,测试途中会报路径拼接错误,应该是autoloader的原因,也就是获取资源路径错误,错误路径:(站点/分类/{cid}/components/prism-xxx.min.js),正确路径:(/usr/themes/Joe/assets/plugin/prism/1.9.0/components/),因此又加入了劫持代码,使其强制修正绝对路径,切换页面不会报错,但通过链接直接访问依然会概率报此错误。Joe原版主题是没有这个问题的,可能也是因为原版没有Turbolinks的原因吧。

操作步骤

  • 补丁文件(prismTurbolinks.js),随便放个位置。
  • 主题文件全局搜索(prism.min.js),会出现两个文件:(index.js和prism.php)。

index.js在387行-400行之间引入(prismTurbolinks.js)
prismTurbolinks.js
prism.php(/Joe/module/single/prism.php)在末尾引入(prismTurbolinks.js)
prism.php

补丁文件

/**
 * 路径校正 & 高亮补丁
 * 文件:prismTurbolinks.js
 * 解决痛点:
 * 1. prism-autoloader 默认用「当前页目录」拼相对路径,导致在深层路由
 *    (如 /archives/48/)刷新时出现 404:
 *    站点/分类/{cid}/components/prism-xxx.min.js
 * 2. Turbolinks/Turbo 单页切换时,autoloader 再次用错路径。
 *
 * 实现思路:
 * 0. 不改动 prism.min.js 与 autoloader.min.js 本身,仅运行时矫正。
 * 1. 把语言文件目录强制锁成「站点绝对目录」/usr/themes/Joe/assets/plugin/prism/1.9.0/components/
 * 2. DOM 构建完立即执行一次 → 覆盖“首次刷新”场景。
 * 3. 监听 Turbolinks 5.x 事件 turbolinks:load 与 Turbo 7.x 事件 turbo:load
 *    → 覆盖“后续单页切换”场景。
 * 4. 每次矫正完立即调用 Prism.highlightAll(),确保新插 DOM 的代码块被高亮。
 *
 * 性能 & 兼容:
 * - 无新语法(可选链、箭头函数均未使用),IE11 可跑。
 * - 不依赖任何构建工具,直接当普通 JS 文件引入即可。
 * - 若页面无 Turbolinks/Turbo,仅多一次空事件监听,无额外开销。
 */

(function () {
  /* 1. 语言文件绝对目录(末尾必须带 /) */
  var DIR = '/usr/themes/Joe/assets/plugin/prism/1.9.0/components/';

  /**
   * 核心修复函数:
   * - 矫正 autoloader 全局路径
   * - 立即高亮当前页面
   */
  function fix() {
    // 仅当 Prism 与 autoloader 已加载才继续
    var al = window.Prism && Prism.plugins && Prism.plugins.autoloader;
    if (!al) return;

    // 锁目录:防止 autoloader 根据当前页 URL 重新计算相对路径
    al.languages_path = DIR;

    // 高亮当前已存在于 DOM 的代码块
    if (window.Prism && Prism.highlightAll) {
      Prism.highlightAll();
    }
  }

  /* 2. 首次进入页面(硬刷新) */
  if (document.readyState === 'loading') {
    // DOM 尚未解析完,等待 DOMContentLoaded
    document.addEventListener('DOMContentLoaded', fix);
  } else {
    // DOM 已就绪,立即执行
    fix();
  }

  /* 3. 单页路由切换后再次执行(Turbolinks 5.x & Turbo 7.x)*/
  document.addEventListener('turbolinks:load', fix);
  document.addEventListener('turbo:load', fix);
})();

PC和安卓是正常的,针对苹果端以上仅是临时解决方案,通过链接直接访问含有代码块的页面时会报路径拼接错误,大概率是(prism-autoloader.min.js)库的问题,只要在切换路由时让他重新加载依赖就会报这个错误。解决只能在开始就规避这个问题。实在不行还是原版Joe吧,他奶奶的。


nb

© 版权声明
THE END
喜欢就支持一下吧
点赞 9 分享 赞赏
评论 抢沙发
OωO
取消