Go WASM:如何在 Go 中访问 DOM API?

简介: Go WASM:如何在 Go 中访问 DOM API?

在上一篇文章中,我们讲解了如何通过 JavaScript 调用 Go 编写的函数。

如何通过 JavaScript 运行用 Go 编写的 WebAssembly 模块?

这一篇文章主要介绍如何在 Go 中访问 DOM API。

文章中的代码是使用上篇文章中的代码作为基础进行开发的,如果读不懂可以去看一下上一篇文章。


访问 DOM API


我会带大家做一个小案例,这里案例会使用 go 的 crypto/rand 库生成 0-10 万之间的真随机数,并将它放置到 p 标签中输入到页面上。

首先实现一个 myRand 函数,用来生成随机数。


func myRand() (*big.Int, error) {
  n, err := rand.Int(rand.Reader, big.NewInt(100000))
  return n, err
}

然后实现包裹函数。


func randWrapper() js.Func {
  return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
    jsDoc := js.Global().Get("document")
    if !jsDoc.Truthy() {
      return "document is not defined"
    }
    containerEl := jsDoc.Call("getElementById", "rand-container")
    if !containerEl.Truthy() {
      return "rand-container is not find"
    }
    p := jsDoc.Call("createElement", "p")
    n, err := myRand()
    if err != nil {
      return "unable to generate random number"
    }
    p.Set("innerText", n.Text(10))
    containerEl.Call("append", p)
    return nil
  })
}

包裹函数中的代码主要就是在 Go 中访问 DOM API 的代码,我在这里给大家解释一下。

  • js.Global():该方法的返回值对应的是 JavaScript 的全局对象,也就是浏览器的 window 对象。
  • obj.Get("prop"):obj 代表 JavaScript 中的某个对象,Get 方法可以访问它的 key。就像是 JavaScript 中的 obj.prop。
  • obj.Truthy():该方法和 obj == true 类似,用来判断是否为 nil。
  • obj.Call("method"):该方法用来调用某个对象身上的方法,类似于 JavaScript 中的 obj.method()。我们也可以在后面传递其他参数,作为实际被调用方法的参数。
  • obj.Set("prop", value):obj 代表 JavaScript 中的某个对象,Set 方法可以设置它的属性。就像是 JavaScript 中的 obj.prop = value。值得一提的是,如果想获取或者设置全局变量,都可以通过 jsGlobal().Get/jsGlobal().Set 来操作。

解释完,上面的代码就不难理解了。

我们首先获取 document 对象,然后再去获取一个 id 为 rand-container 的元素。

再去创建一个 p 元素,调用 rand 方法获取随机数,把随机数设置为 p 的内容。

最后把 p 添加到 rand-container 元素中。

实现好这两个函数后,在 main 方法中将这个方法加入到全局对象中。


js.Global().Set("addRand", randWrapper())

然后将代码编译为 wasm 模块。

来到 index.html 中,添加两个元素。


<div id="rand-container"></div>
<button onclick="addRand()">add rand</button>

启动服务器。


go run main.go

来到浏览器中看一下效果。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/504c114d14204e1b9a145eaa35f52e8f~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

大功告成!



相关文章
|
2月前
|
JSON 应用服务中间件 API
利用Grafana的API Key+Nginx反向代理实现Grafana免登录访问
利用Grafana的API Key+Nginx反向代理实现Grafana免登录访问
190 1
|
17天前
|
Java API Maven
使用Java Libvirt API 访问虚拟机信息
使用Java Libvirt API 访问虚拟机信息
12 1
|
25天前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
|
14天前
|
JavaScript 前端开发 定位技术
vue 使用 vue-jsonp 解决跨域请求问题(访问百度地图API)
vue 使用 vue-jsonp 解决跨域请求问题(访问百度地图API)
21 0
|
1月前
|
机器学习/深度学习 数据采集 文字识别
印刷文字识别产品使用合集之需要对子用户加什么权限,才能通过API访问
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
1月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之SD API模式可以通过什么方式进行访问
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
2月前
|
JSON 自然语言处理 Dart
私有化部署 Llama3 大模型, 支持 API 访问
通过 ollama 本地运行 Llama3 大模型其实对我们开发来说很有意义,你可以私有化放服务上了。 然后通过 api 访问,来处理我们的业务,比如翻译多语言、总结文章、提取关键字等等。 你也可以安装 enchanted 客户端去直接访问这个服务 api 使用。
642 0
私有化部署 Llama3 大模型, 支持 API 访问
|
2月前
|
API Go
使用Go语言通过API获取代理IP并使用获取到的代理IP
使用Go语言通过API获取代理IP并使用获取到的代理IP
|
2月前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
2月前
|
存储 关系型数据库 Go
【Go语言专栏】基于Go语言的RESTful API开发
【4月更文挑战第30天】本文介绍了使用Go语言开发RESTful API的方法,涵盖了路由、请求处理、数据存储和测试关键点。RESTful API基于HTTP协议,无状态且使用标准方法表示操作。在Go中,通过第三方库如`gorilla/mux`进行路由映射,使用`net/http`处理请求,与数据库交互可选ORM库`gorm`,测试则依赖于Go内置的`testing`框架。Go的简洁性和并发性使得它成为构建高效API的理想选择。