如何使用作用于js.Value的Invoke从Go / WASM中调用javascript函数?

问题描述

在切换到全屏模式之前,我需要使用Go WASM Canvas项目检查全屏支持。到目前为止,我有以下代码

var fullscreenFunc         js.Value
var fullscreenNotSupported bool

设置以下逻辑:

fullscreenFunc = app.Get("requestFullscreen")
if fullscreenFunc.IsUndefined() {
    fullscreenFunc = app.Get("mozRequestFullScreen")
    if fullscreenFunc.IsUndefined() {
        fullscreenFunc = app.Get("webkitRequestFullscreen")
        if fullscreenFunc.IsUndefined() {
            fullscreenFunc = app.Get("msRequestFullscreen")
            if fullscreenFunc.IsUndefined() {
                fullscreenNotSupported = true
                println("Fullscreen not supported")
            }
        }
    }
} 

我希望能够使用js.Invoke调用正确的函数,但是我看不到告诉Invoke应该在哪个对象上进行调用方法。我的“ app”值被解释为参数。

func Fullscreen(app js.Value) {
    if fullscreenNotSupported {
        return
    }
    fullscreenFunc.Invoke(app)
}

导致:

panic: JavaScript error: 'mozRequestFullScreen' called on an object that does not implement interface Element.

因此,我是否认为可以调用正确方法的唯一方法不是存储函数,而是存储函数名称的字符串,然后使用“调用” /“调用”它。以下方法

app.Call(fullscreenFunctionNameString)

感觉就像我误解了Invoke的目的。它仅适用于js.Global()类型调用吗?

[edit]使用“调用”,至少似乎有可能无需重复上述浏览器详细信息即可得出函数名称

fullscreenFunctionName = fullscreenFunc.Get("name").String()
app.Call(fullscreenFunctionNameString)

它不能回答问题,但可能对尝试这样做的人有所帮助。

解决方法

要调用的参数变为它包装的javascript函数的参数。由于这些全屏功能不需要任何参数,因此我认为您可能只需要更改:

fullscreenFunc.Invoke(app)

收件人:

fullscreenFunc.Invoke()

...假设app在两个地方都是相同的JS元素。如果不是这样,您的Call解决方案可能是您最好的选择。