JavaScript 运行时

原文:https://go-rod.github.io/i18n/zh-CN/#/javascript-runtime

收录该文档时间: 2024-11-21T08:09:20+08:00

JavaScript 运行时

​ 我们可以使用 Rod 在页面上执行任意 JavaScript 代码。 例如用它来读取或修改页面的 HTML 内容。

在页面上 eval

​ 例如,使用 Page.Eval 设置全局变量:

1
page.MustEval(`() => window.a = {name: 'jack'}`)

​ 我们可以使用 js 函数的参数来获取 golang 变量, 这是如何从 golang 中获取 keydata 数据并将其设置为页面 window 上的对象 k

1
2
3
4
5
key := "a"
data := map[string]string{"name": "jack"}
page.MustEval(`(k, val) => {
    window[k] = val
}`, key, data)

​ 从 Eval 获取返回值:

1
2
val := page.MustEval(`() => a`).Get("name").Str()
fmt.Println(val) // output: jack

Eval 只接受 js 函数,如下代码是无效的:

1
page.MustEval(`a`) // 将失败

在元素上 eval

Element.EvalPage.Eval 类似,但是对于前者来说,this 对象代表当前元素。 例如在页面上有一个 <button>Submit</button> ,我们可以用 JS 来读取或修改元素:

1
2
3
4
el := page.MustElement("button")
el.MustEval(`() => this.innerText = "Apply"`) // 更改内容
txt := el.MustEval(`() => this.innerText`).Str()
fmt.Println(txt) // 输出: Apply

将 Go 函数暴露给页面

​ 我们使用 Page.Expose 来把回调函数暴露给页面。 例如,我们可以像这样暴露函数,来帮助页面计算 md5:

1
2
3
page.MustExpose("md5", func(g gson.JSON) (interface{}, error) {
    return md5.Sum([]byte(g.Str())), nil
})

​ 现在页面可以在 window 对象上调用这个方法:

1
2
hash := page.MustEval(`() => window.md5("test")`).Str()
fmt.Println(hash)

​ 下面是另一个例子来获取页面上的按钮事件:

1
2
3
4
page.MustExpose("myClick", func(v gson.JSON) (interface{}, error) {
    fmt.Println("点击了")
    return nil, nil
})

​ 点击按钮时调用 ‘myClick’ 方法:

1
page.MustElement("button").MustEval(`() => this.onclick = myClick`)
最后修改 November 21, 2024: init (2a1db69)