Go语言使用go-sciter创建桌面应用(三) 事件处理,函数与方法定义,go与tiscript之间相互调用

Sciter 处理脚本 tiscript,用于处理UI交互中的一些逻辑,跟js很像,但又有点区别,对前端熟悉的人应该能很快上手。

tiscrip脚本文档

https://sciter.com/developers/sciter-docs/script/

dom类文档

https://sciter.com/developers/sciter-docs/dom-classes/

demo4.go代码如下:

package main;
 
import (
    "github.com/sciter-sdk/go-sciter"
    "github.com/sciter-sdk/go-sciter/window"
    "log"
    "fmt"
)
 
//设置元素的处理程序
func setElementHandlers(root *sciter.Element) {
    btn1, _ := root.SelectById("btn1");
    //处理元素简单点击事件
    btn1.OnClick(func() {
        fmt.Println("btn1被点击了");
    });
 
    //这里给元素定义的方法是在tiscript中进行调用的
    //并且作为元素的属性进行访问
    btn1.DefineMethod("test", func(args ...*sciter.Value) *sciter.Value {
        //我们把从传入的参数打印出来
        for _, arg := range args {
            //String()把参数转换成字符串
            fmt.Print(arg.String() + " ");
        }
 
        //返回一个空值
        return sciter.NullValue();
    });
    btn2, _ := root.SelectById("btn2");
    //调用在tiscript中定义的方法
    data, _ := btn2.CallMethod("test2", sciter.NewValue("1"), sciter.NewValue("2"), sciter.NewValue("3"));
    //输出调用方法的返回值
    fmt.Println(data.String());
}
 
//设置回调
func setCallbackHandlers(w *window.Window) {
    //CallbackHandler是一个结构,里面定义了一些方法
    //你可以通过实现这些方法,自定义自已的回调
    cb := &sciter.CallbackHandler{
        //加载数据开始
        OnLoadData: func(p *sciter.ScnLoadData) int {
            //显示加载资源的uri
            fmt.Println("加载:", p.Uri());
            return sciter.LOAD_OK;
        },
        //加载数据过程中
        OnDataLoaded: func(p *sciter.ScnDataLoaded) int {
            fmt.Println("加载中:", p.Uri());
            return sciter.LOAD_OK;
        },
    };
    w.SetCallback(cb);
}
 
//定义函数
func setWinHandler(w *window.Window) {
    //定义函数,在tis脚本中需要通过view对象调用
 
    //定义inc函数,返回参数加1
    w.DefineFunction("inc", func(args ...*sciter.Value) *sciter.Value {
        return sciter.NewValue(args[0].Int() + 1);
    });
    //定义dec函数,返回参数减1
    w.DefineFunction("dec", func(args ...*sciter.Value) *sciter.Value {
        return sciter.NewValue(args[0].Int() - 1);
    });
}
 
//测试调用函数
func testCallFunc(w *window.Window) {
    //调用tis脚本中定义的函数
    data, _ := w.Call("sum", sciter.NewValue(10), sciter.NewValue(20));
    fmt.Println(data.String());
    root, _ := w.GetRootElement();
    //我们也可以指定元素调用函数
    data, _ = root.CallFunction("sum", sciter.NewValue(50), sciter.NewValue(100));
    fmt.Println(data.String());
}
 
func main() {
    //创建一个新窗口
    w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect);
    if err != nil {
        log.Fatal(err);
    }
 
    w.LoadFile("demo4.html");
    //设置标题
    w.SetTitle("事件处理");
 
    //设置回调处理程序
    setCallbackHandlers(w);
    //获取根元素
    root, _ := w.GetRootElement();
    //设置元素处理程序
    setElementHandlers(root);
    //设置窗口处理程序
    setWinHandler(w);
    //测试调用函数
    testCallFunc(w);
 
    //显示窗口
    w.Show();
    //运行窗口,进入消息循环
    w.Run();
}

demo4.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件处理</title>
</head>
<body>
    <button id="btn1">点我</button>
    <button id="btn2">点我2</button>
    <button id="btn3">点我3</button>
    <button id="btn4">点我4</button>
    <script type="text/tiscript">
        //view是一个全局的视图对象,root是加载的根元素
        var root = view.root;
 
        //通过self.$()方法选择元素,类似jquery的$
        //self.$()这里面参数不要加双引号
        //我们调用在go中为btn1定义的方法
        $(#btn1).on("click", function() {
            //this指向的当前元素
            this.test("参数1", "参数2", "参数3");
        });
 
        //在go中也可以调用我们在tis中为btn2定义的方法
        $(#btn2).test2 = function(a, b, c) {
            return String.printf("我是tis中为btn2定义的方法test2 %v %v %v", a, b, c);
        };
 
        //我们定义一个函数(注意函数与方法的区别)
        //这里的函数并没有指定属于哪个对象
        function sum(num1, num2) {
            return num1 + num2;
        }
 
        //调用go中定义的函数
        $(#btn3).on("click", function() {
            view.msgbox(#alert, view.dec(5));
        });
        $(#btn4).on("click", function() {
            view.msgbox(#alert, view.inc(5));
        });
    </script>
</body>
</html>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Regulations/article/details/105655306
今日推荐