Skip to content

钩子 ​

通过 window.cnblogsConfig.hooks 在插件处理过程中执行自己的代码。配置需要放在插件脚本之前。

示例 ​

javascript
window.cnblogsConfig = {
  hooks: {
    beforeCode: (_) => {
      console.log('准备处理代码块');
    },
    afterCode: (_) => {
      console.log('代码组件已发起渲染');
    },
    beforeLoading: (_) => {
      console.log('开始加载');
    },
    afterLoading: (_) => {
      console.log('Loading 遮罩已关闭');
    },
    dayNightControl: (_, type) => {
      console.log('切换到', type); // day 或 night
    },
  },
};

调用时机 ​

钩子参数时机
beforeCode_代码组件开始处理之前
afterCode_代码组件发起渲染之后;使用 hljs 时不会等待高亮及行号的异步处理完成
beforeLoading_创建 Loading 遮罩之前,此时滚动和窗口事件尚未初始化
afterLoading_关闭 Loading 遮罩之后,不代表所有异步资源都已加载完成
dayNightControl_, type点击日夜切换按钮时;type 为 day 或 night,初始化模式不会触发

这些钩子目前不会等待回调返回的 Promise。不要将 afterCode 或 afterLoading 当作所有资源就绪的通知。

上下文参数 ​

_ 包含插件当前使用的配置和内部状态:

  • _.__config:合并默认值后的配置。修改它不会自动重新渲染已经生成的页面。
  • _.__status:当前页面状态。
  • _.__tools:公共工具,见源码。
  • _.__event:滚动和窗口大小事件的状态与回调列表。

这些内部字段可能随实现变化,使用时应核对所用版本。

监听滚动或窗口大小变化 ​

在 afterLoading 中,事件列表已经初始化。例如:

javascript
window.cnblogsConfig = {
  hooks: {
    afterLoading: (_) => {
      _.__event.scroll.handle.push(() => {
        console.log('页面发生滚动');
      });
      _.__event.resize.handle.push(() => {
        console.log('窗口大小变化');
      });
    },
  },
};

_.__event 上没有 handle.scroll() 或 handle.resize() 方法。需要通知窗口监听器时可以使用浏览器事件:

javascript
window.dispatchEvent(new Event('resize'));

此事件也会通知页面中其他监听器。完整实现见事件组件。