• 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>
    

  • 相关阅读:
    如何检索某个字段在sqlserver中的哪个些存储过程中?很简单的SQL语句。
    如何去掉HTML代码来获取纯文本?
    ajax实现跨域请求
    ajax实现跨域提交
    lab3
    Lab2
    hw2
    Homework1
    Lab1
    CS61B_学习计划和进程
  • 原文地址:https://www.cnblogs.com/jkko123/p/7048066.html
Copyright © 2020-2023  润新知