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

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>

技术分享

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