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

大功告成!



相关文章
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
402 2
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
810 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
钉钉宜搭--远程API,在其他人访问时无法生效
简介: 描述了一种远程API配置问题的场景。开发人员在本地可正常通过应用表单获取数据,但同组织的其他同事访问时无法获取数据,尽管已设置全部权限。问题是关于如何解决这种跨用户数据访问异常的情况,确保同事间能正常共享数据。
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
负载均衡 数据可视化 API
像素流送api ue多人访问需要什么显卡服务器
本文总结了关于像素流送技术的五大常见问题,包括是否支持Unity模型推流、UE多人访问的最大并发数、所需服务器配置、稳定性问题及API支持情况,旨在帮助开发者更好地理解和应用这一技术。
882 1
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
编解码 中间件 API
API实现跨平台访问的方式
【10月更文挑战第16天】API实现跨平台访问的方式
485 2
|
API iOS开发 开发者
Snapchat API 访问:Objective-C 实现示例
Snapchat API 访问:Objective-C 实现示例
757 11
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。