文档手册

文档生命周期事件

2024-07-06 23:14:45

文档生命周期事件

在窗口构造阶段,Sciter引擎执行以下操作:

  1. 创建具有未确定尺寸的窗口(HWND);

  2. 加载文档:

    • 解析文档;

    • 加载样式;

    • 加载JS,这也会运行零级代码(变量、函数等的初始化);

    • 根据CSS声明分配脚本行为;

    • 运行document.ready,在这里如果知道窗口尺寸,可以使用window.move(x,y,w,h)。

    • 步骤:

  3. 设置窗口尺寸:如果之前在脚本中没有设置,则从根元素<html>的属性中获取。

  4. 触发ready事件(document.on("ready", function() {}))。注意:此时窗口尺寸已知,可以使用window.move(x,y)。

  5. Sciter中的所有<script>元素在文档解析后执行。就像浏览器中定义了“defer”属性:<script defer>。

任何<script>元素都可以在加载时直接执行代码和/或包含事件处理程序,因此:

<script>

// 这里的代码在DOM加载后作为第一步执行...
// 同步,在SciterLoadFile()调用内部执行

document.ready = function() {
    // 代码作为第二步在DOM加载和原型/方面分配后执行...
    // 同步调用,在SciterLoadFile()内部执行。
    // 所有由CSS原型和方面声明的组件都已实例化 - 它们的componentDidMount被调用
    // 但窗口仍处于构造阶段(例如尺寸未知)
}

document.on("ready", function() {
    // **已发布**的事件处理程序作为第三步执行
    // 异步,在SciterLoadFile()调用**之后**执行
    // 此时窗口可能已经可见
});

// 或者:
document.on("DOMContentLoaded", function() {
    // **已发布**的事件处理程序作为第三步执行
    // 异步,在SciterLoadFile()调用**之后**执行
    // 此时窗口可能已经可见
});
</script>

在卸载过程中,会按以下顺序触发事件:

const UNLOAD_BY_CHROME = 0; // 用户点击窗口上的关闭按钮
const UNLOAD_BY_CODE = 1;   // 执行window.close()
const UNLOAD_BY_LOAD = 2;   // 文档卸载旧的/加载新的

document.on("closerequest", function(evt){
  // 调用此函数
  if(evt.reason == UNLOAD_BY_CHROME)
    evt.preventDefault(); // 如果需要在用户点击X时阻止文档卸载
  // 在根文档上,这也会阻止窗口关闭。
});

document.on("beforeunload", function(evt){
  // 不可取消的事件。
  // 文档即将卸载,此时文档脚本命名空间仍然有效并且可操作。
})

frame.on("close", function(evt){
  // 不可取消的事件。
  // 文档几乎已经消失。处理此事件在文档容器上更有意义:<frame>或窗口。
})