go语言使用go-sciter创建桌面应用(六) Element元素操作和Event事件响应

详细的文档请看下面两个链接:

https://sciter.com/docs/content/sciter/Element.htm
https://sciter.com/docs/content/sciter/Event.htm

demo8.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tiscript脚本学习</title>
    <style>
        #mouse {
            border: 1px solid #ccc;
            width: 500px;
            height: 500px;
        }
    </style>
</head>
<body>
<div id="box">
    <ul>
        <li>1111</li>
        <li>2222</li>
        <li>3333</li>
    </ul>
</div>
<div id="form">
    ID: <input type="text" name="id" value="001"><br>
    姓名:<input type="text" name="name"><br>
    性别:<input type="radio" name="sex" value="0">男
    <input type="radio" name="sex" value="1">女
    <button id="btn1">按钮</button>
    <button id="btn2">定时</button>
</div>
<div id="event">
    <input type="text" id="ipt"><br>
    <input type="text" id="ipt2"><br>
    <button id="btn3">单击</button>
    <br>
    <button id="btn4">双击</button>
    <br>
    <select id="sel">
        <option value="11">11</option>
        <option value="22">22</option>
        <option value="33">33</option>
    </select>
    <div id="mouse"></div>
</div>
<script type="text/tiscript">
    //类似jquery的ready();
    self.ready = function() {
        testDom();
        testEvent();
    };

    //测试Dom操作
    function testDom() {
        //选择元素,不要加引号
        var box = self.$(#box);
        //效果同上,注意要加引号
        var box2 = self.select("#box");
        //选择多个元素
        var lis = self.$$(#box > ul > li);
        stdout.println(lis.length);
        //同上
        var lis2 = self.selectAll("#box > ul > li");
        stdout.println(lis2.length);
        //first表示元素的第一个子元素
        stdout.println(lis.first.text);
        //last表示元素的最后一个子元素
        stdout.println(lis.last.text);

        var li = self.$(#box > ul > li:nth-child(1));
        //next表示下一个兄弟元素
        stdout.println(li.next.text);

        //访问元素的属性
        stdout.println(box.attributes["id"]);
        //设置元素的属性
        box.attributes["status"] = "open";

        //设置元素的样式
        li.style["background"] = "#f00";

        //判断元素是否可见
        var li2 = self.$(#box > ul > li:nth-child(2));
        li2.style["display"] = "none";
        if(!li2.isVisible) {
            stdout.println("li2不可见");
        }

        //遍历元素
        for(var child in lis) {
            stdout.println(child.text);
        }

        //动态创建元素
        var li4 = new Element("li");
        //将li元素追加到ul元素内部
        $(#box > ul).append(li4);
        //设置元素的文本
        //注意这里需先将元素添加到dom树上,然后再设置元素文本
        li4.text = "444";

        //这里直接追加html内容,不要加引号
        $(#box > ul).$append(<li>555</li>);
        $(#box > ul).$prepend(<li>000</li>);
        //外部追加
        $(#box).$after(<div>after</div>);
        $(#box).$before(<div>before</div>);

        //删除元素
        $(#box > ul > li:nth-child(4)).remove();

        //设置元素的状态
        //设置只读
        $(input[name=‘id‘]).setState(Element.STATE_READONLY);
        //设置焦点
        $(input[name=‘name‘]).setState(Element.STATE_FOCUS);
        //设置选中
        $(input[name=‘sex‘][value=‘1‘]).setState(Element.STATE_CHECKED);
        //设置禁用
        $(#btn1).setState(Element.STATE_DISABLED);

        //定时器
        var cnt = 5;
        $(#btn2).timer(1000, function() {
            if(cnt == 0) {
                //返回false则停止定时器
                return false;
            }
            this.text = "第" + cnt + "次";
            cnt--;
            return true;
        });
    }

    //测试元素事件
    function testEvent() {
        //单击事件
        $(#btn3).onClick = function() {
            stdout.println("btn3被点击了");
        };
        //双击事件
        $(#btn4).on("dblclick", function() {
            stdout.println("btn4被双击了");
        });
        //按键弹起
        $(#ipt).on("keyup", function() {
            stdout.println(this.value);
        });
        //value值改变时
        $(#sel).on("change", function() {
            stdout.println(this.value);
        });

        //移除事件函数
        $(#btn4).off("dblclick");
        //或者如下
        $(#btn4).unsubscribe("dblclick");

        //判断事件类型和按键码值
        $(#ipt2).on("keyup", function(evt) {
            //evt.type表示事件类型
            //evt.keyCode表示键码值
            if(evt.type == Event.KEY_UP && evt.keyCode == Event.VK_RETURN) {
                stdout.println("你回车了");
            }
        });

        //鼠标移动事件
        $(#mouse).on("mousemove", function(evt) {
            var str = "";
            str += "相对于div本身的 x:" + evt.x + " y:" + evt.y + "<br>";
            str += "相对于根元素html本身的 x:" + evt.xRoot + " y:" + evt.yRoot + "<br>";
            str += "相对于window窗口本身的 x:" + evt.xView + " y:" + evt.yView + "<br>";
            this.html = str;
        });
    }

</script>
</body>
</html>

由于html中使用了tiscript,所以如果要调试,只能使用sciter-sdk中自带的调试工具,进行调试。

在sciter-sdk下找到bin\64\sciter.exe和inspector.exe这两个文件,拷贝到你指定的位置,注意这两个文件要放在一起。

双击打开sciter.exe文件

注意只能调试静态页面,go中定义的方法和函数,没法调用显示。

了解了上面的的Element操作和Event事件处理,我们简单写个小例子:

demo7.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tiscript脚本学习</title>
</head>
<body>
<form action="">
    <table>
        <tr>
            <td>用户名:</td>
            <td>
                <input type="text" name="name">
            </td>
        </tr>
        <tr>
            <td>密码:</td>
            <td>
                <input type="password" name="pwd">
            </td>
        </tr>
        <tr>
            <td>爱好:</td>
            <td>
                <input type="checkbox" name="love" value="0">看书
                <input type="checkbox" name="love" value="1">打球
                <input type="checkbox" name="love" value="2">旅游
            </td>
        </tr>
        <tr>
            <td>性别:</td>
            <td>
                <select name="sex">
                    <option value="-1">请选择</option>
                    <option value="0">男</option>
                    <option value="1">女</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>简介:</td>
            <td>
                <textarea name="desc" cols="30" rows="5"></textarea>
            </td>
        </tr>
    </table>
</form>
<button id="btn1">注册</button>
<script type="text/tiscript">
    $(#btn1).on("click", function() {
        //获取文本框中的值
        var name = $(input[name=‘name‘]).value.trim();
        if(name.length == 0) {
            //弹出警告框
            view.msgbox(#warning, "用户名不能为空");
            return false;
        }

        //获取文本框中的值
        var pwd = $(input[name=‘pwd‘]).value.trim();
        if(pwd.length == 0) {
            //弹出警告框
            view.msgbox(#warning, "密码不能为空");
            return false;
        }

        //这里使用$$返回所有,$只是返回第一个满足选择器的元素
        var ipt = $$(input[name=‘love‘]);
        var love = [];
        for(var child in ipt) {
            //获取元素的状态,判断是否选中
            if(child.getState(Element.STATE_CHECKED)) {
                love.push(child.value);
            }
        }

        //获取select下option,先选取select,然后再$$找查它的子元素
        var opt = $(select[name=‘sex‘]).$$(option);
        var sex = 0;
        for(var child in opt) {
            //判断元素是否选中
            if(child.getState(Element.STATE_CHECKED)) {
                sex = child.value;
            }
        }

        //获取简介
        var desc = $(textarea[name=‘desc‘]).value.trim();

        //表单数据
        var formData = {
            "name": name,
            "pwd": pwd,
            "love": love,
            "sex": sex,
            "desc": desc
        };

        //我们把从表单中的数据获取,并转成json字符串
        //调用go中定义的函数reg,这样go中就可以获取到ui中的数据了。
        view.reg(JSON.stringify(formData));
    });
</script>
</body>
</html>

demo7.go代码如下:

package main;

import (
	"github.com/sciter-sdk/go-sciter/window"
	"github.com/sciter-sdk/go-sciter"
	"log"
	"fmt"
)

func defFunc(w *window.Window) {
	//注册dump函数方便在tis脚本中打印数据
	w.DefineFunction("dump", func(args ...*sciter.Value) *sciter.Value {
		for _, v := range args {
			fmt.Print(v.String() + " ");
		}
		fmt.Println();
		return sciter.NullValue();
	});
	//注册reg函数,用于处理注册逻辑,这里只是简单的把数据打印出来
	w.DefineFunction("reg", func(args ...*sciter.Value) *sciter.Value {
		for _, v := range args {
			fmt.Print(v.String() + " ");
		}
		fmt.Println();
		return sciter.NullValue();
	});
}

func main() {
	w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect);
	if err != nil {
		log.Fatal(err);
	}
	w.LoadFile("demo7.html");
	w.SetTitle("tiscript脚本学习");
	defFunc(w);
	w.Show();
	w.Run();
}

运行结果如下:

拿到了前端UI传入的json数据,后端go就可以通过解析该json,来进行相应处理,比如存入mysql数据库等等。

时间: 2024-10-01 06:55:17

go语言使用go-sciter创建桌面应用(六) Element元素操作和Event事件响应的相关文章

go语言使用go-sciter创建桌面应用(二) ui元素查找,增加,删除,修改

我们可以通过go-sciter给我们提供的方法,方便的对html,css编写的UI界面进行增删改查. demo3.go代码如下: package main; import ( "github.com/sciter-sdk/go-sciter" "github.com/sciter-sdk/go-sciter/window" "log" "fmt" ) //一些基础操作 func base(root *sciter.Elemen

js Dom(三)节点、元素创建3种方式、为元素绑定多个事件addEventListener、attachEvent

目录: 1.节点的概念    2.节点的属性(nodeType,nodeName,nodeValue)    3.父节点(父元素)    4.获取子节点或子元素    5.获取节点.元素的方法(12行代码)    6.案例:div标签里面的p标签背景高亮(使用子节点或子元素的方式)    7.封装节点兼容代码    8.案例:切换背景图片    9.案例:全选.全不选    10.元素创建的第一种方式  document.write("<p>文本</P>"); 

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-

go语言使用go-sciter创建桌面应用(七) view对象常用方法,文件选择,窗口弹出,请求

view对象的详细文档请看: https://sciter.com/docs/content/sciter/View.htm demo9.html代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>view对象学习</title> <style> .br { width: 100%;

如何创建桌面应用程序

上次我们创建了控制台应用程序,今天我们就谈谈如何创建桌面应用程序. 第一步.我们打开VS2017,出现如下界面(此界面前面我们已讲过,这里就不再谈论了): 第二步.单击“文件(F)--->新建(N)--->项目(P)...”就弹出“新建项目”对话框,其界面如下: 第三步.在此对话框中选择“Visual C#--->Windows 桌面--->WPF 应用(.NET Framework)”,并且选择好文件保存的路径(即界面的“位置”),最后单击“确定”按钮即可创建控制台应用程序,其界

创建桌面快捷图标

分析桌面程序的源码发现具有接收创建桌面快捷图标的广播接受,创建快捷突变即发送广播的方式来实现的.下面来分析创建桌面快捷图标的过程. 1. 在应用程序的第一个Activity,添加创建快捷图标的方法, installShortCut(); // 创建桌面快捷图标 private void intallShotCut() { // 定义广播通知桌面创建快捷图标 Intent intent = new Intent(); intent.setAction("com.android.launcher.a

手把手教你在ubuntu下创建桌面快捷方式

习惯使用windows的朋友来说创建桌面快捷方式简直就是so easy, 鼠标右键点击文件-->选择发送桌面快捷方式,就OK了.对于ubuntu下该怎样创建桌面快捷方式呢?下面以创建eclipse的快捷方式为例,简单介绍一下. 环境: 1)系统版本:Ubuntu 14.04 2)桌面环境:Unity 3)已经下载并解压eclipse(免安装)到/opt目录下 详细步骤: 1)新建文件eclipse.desktop,命令如下: sudo vim /usr/share/applications/ec

Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单

{================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单.右键菜单 快捷方式 参 数: FileName : 快捷方式执行文件名 Description : 快捷方式描述信息 Arguements : 快捷方式执行参数 ShowName : 快捷方式显示名称 Location : 快捷方式类别 id : 需设置状态的队列号(255 为设置) Create

ios 创建桌面快捷方式

iOS上创建桌面快捷方式 应用场景: 在iOS设备桌面创建app内某一个模块或页面的快捷方式,通过该快捷方式可以直接进入相应模块或页面.目前app内有该功能的有高德一键导航,360安全卫士的小火箭. 技术原理: 在iOS开发中可以使用openUrl的方式打开一个网页,并通过Safari浏览器的发送到主屏幕从而创建一个网页的快捷方式,这篇文章就是利用这个方法来创建一个app的桌面快捷方式.首先在app内部开启一个轻量级的HttpServer,利用openurl:127.0.0.1 的方式打开本地页