Sciter窗口间状态事件交互(四)

Sciter窗口间状态事件交互(四)

原文:https://lingkang.top/archives/sciter-window-s-and-event

前言

Sciter 是一个高质量但小众的嵌入式 UI 引擎,适合追求性能、体积和原生集成的桌面应用开发者。

我觉得 Sciter 比较有意思,它很小众,是闭源的,商用需要许可。它是Andrew Fedoniouk开发维护,Andrew获得了物理学和应用数学硕士学位以及艺术文凭。他的职业生涯始于俄罗斯航空航天工业的研究员。这种跨领域背景使他既具备深厚的技术功底,又懂得用户界面设计的艺术。

Sciter官网:https://sciter.com/ 2025-11-15 sciter-js-sdk最新版v6.0.2.28

本次入门开发环境:window 10 + Clion 2024.3 + Sciter-js v6.0.2.28(2025-11-15最新版) + Bundled MinGW 11.0

1.Window事件监听与发送事件

1.1 拿到对方窗口对象发送

父窗口

html 复制代码
<html>
<head>
    <meta charset="utf-8">
    <title>父窗口</title>
    <script src="../../module/zepto.js"></script>
    <link rel="stylesheet" href="../../css/lk-all.css">
</head>
<body class="flex-column lk-gap-10">
<h1>这里是父窗口</h1>
<button id="create" class="lk-button lk-button-primary">创建子窗口</button>
<button id="send" class="lk-button lk-button-primary">发送事件/数据到子窗口</button>
<button id="post" class="lk-button lk-button-primary">发送事件/数据到子窗口(异步)</button>

<script>
    let number = 0;
    let sonWindow
    $('#create').click(function () {
        // 更多Window属性: https://docs.sciter.com/docs/DOM/Window
        sonWindow = new Window({
            url: __DIR__ + 'message_son01.html',
        });
    })
    $('#send').click(async function () {
        const event = new Event('my-event-name', {
            data: 'lingkang你好~我是同步发送: ' + number
        })
        // 同步发送
        await sonWindow.dispatchEvent(event)
        number++
    })
    $('#post').click(function () {
        // 更多Event属性: https://docs.sciter.com/docs/DOM/Event
        const event = new Event('my-event-name', {
            data: 'lingkang 异步: ' + number++
        })
        // 同步发送
        sonWindow.postEvent(event)
    })
</script>
</body>
</html>

子窗口

html 复制代码
<html window-width="400"
      window-height="400"
>
<head>
    <meta charset="utf-8">
    <title>子窗口son</title>
    <script src="../../module/zepto.js"></script>
    <link rel="stylesheet" href="../../css/lk-all.css">
</head>
<body>
<h1>这里是子窗口</h1>
<p id="content"></p>
<script>
    Window.this.on("my-event-name", function (event) {
        $('#content').html(`收到的数据:${event.data} 事件类型:${event.type}`)
    })
</script>
</body>
</html>

效果:

1.2 没有对方窗口对象发送事件/数据

没有明确的接收窗口时,把事件发送到当前进程所有监听事件的窗口

发送方

html 复制代码
<html>
<head>
    <meta charset="utf-8">
    <title>父窗口</title>
    <script src="../../module/zepto.js"></script>
    <link rel="stylesheet" href="../../css/lk-all.css">
</head>
<body class="flex-column lk-gap-10">
<h1>这里是父窗口</h1>
<button id="create" class="lk-button lk-button-primary">创建子窗口</button>
<button id="post" class="lk-button lk-button-primary">发送事件/数据(异步)</button>

<h3 id="result"></h3>
<script>
    let number = 0;
    $('#create').click(function () {
        // 更多Window属性: https://docs.sciter.com/docs/DOM/Window
        const sonWindow = new Window({
            url: __DIR__ + 'message_son02.html',
        });
    })
    $('#post').click(function () {
        // 更多Event属性: https://docs.sciter.com/docs/DOM/Event
        const event = new Event('global-event-name', {
            data: 'lingkang 异步: ' + number++
        })
        // 异步发送。注意没有 this
        Window.post(event)
    })
</script>
</body>
</html>

某个接收的窗口

html 复制代码
<html window-width="400"
      window-height="400"
>
<head>
    <meta charset="utf-8">
    <title>路人甲窗口</title>
    <script src="../../module/zepto.js"></script>
    <link rel="stylesheet" href="../../css/lk-all.css">
</head>
<body>
<h1>这里是路人甲窗口</h1>
<p id="content"></p>
<script>
    // 可以接受到全局的、定向的事件
    Window.this.on("global-event-name", function (event) {
        $('#content').html(`收到的数据:${event.data} 事件类型:${event.type}`)
    })
</script>
</body>
</html>

截图

1.3 总结

拿到对方窗口句柄使用:

  • targetWindow.dispatchEvent(event) // 同步
  • targetWindow.postEvent(event) // 异步

未知哪个窗口发送到全局:(都是异步)

  • Window.post(event) // 注意没有 this
  • Window.send(event) // 遇到第一个消费事件的窗口即停止。

其中父窗口可以使用 Window.all 遍历所有窗口,从而找到想要发送的窗口对象

js 复制代码
for(let targetWin of Window.all){
// ...
console.log(targetWin)
}

2.创建时传参

html 复制代码
<html>
<head>
    <meta charset="utf-8">
    <title>父窗口</title>
    <script src="../../module/zepto.js"></script>
    <link rel="stylesheet" href="../../css/lk-all.css">
</head>
<body class="flex-column lk-gap-10">
<h1>这里是父窗口</h1>
<button id="create" class="lk-button lk-button-primary">创建子窗口</button>

<script>
    let number = 0;
    let sonWindow
    $('#create').click(function () {
        // 更多Window属性: https://docs.sciter.com/docs/DOM/Window
        sonWindow = new Window({
            url: __DIR__ + 'message_son03.html',
            // 使用json
            parameters: {
                data: '你好啊,son'
            }
        });
    })
</script>
</body>
</html>

子窗口

复制代码
<html window-width="400"
      window-height="400"
>
<head>
    <meta charset="utf-8">
    <title>子窗口son</title>
    <script src="../../module/zepto.js"></script>
    <link rel="stylesheet" href="../../css/lk-all.css">
</head>
<body>
<h1>这里是子窗口</h1>
<p id="content"></p>
<script>
    const parameters = Window.this.parameters
    $('#content').html(JSON.stringify(parameters))
</script>
</body>
</html>

截图

相关推荐
仰泳的熊猫4 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
Thera7778 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
君义_noip10 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
旖-旎10 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
顶点多余11 小时前
使用C/C++语言链接Mysql详解
数据库·c++·mysql
汉克老师11 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级
khddvbe11 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
wWYy.12 小时前
STL:list
开发语言·c++
小比特_蓝光13 小时前
vector模拟实现
c++
咱就是说不配啊13 小时前
3.19打卡day33
数据结构·c++·算法