Как я могу получить доступ к свойствам элемента DOM из Go WebAssembly?

Я пытаюсь расширить пример «Hello WebAssembly» из https://github.com/golang/go/wiki/WebAssembly. Как указано, пример просто выводит сообщение на консоль. Я хотел добавить некоторый код, используя syscall/js, чтобы заменить содержимое элемента body.

Приведенная ниже попытка не строится:

package main

import (
    "fmt"

    "syscall/js"
)

func main() {
    fmt.Println("Hello, WebAssembly!") // original example
    // I added
    doc := js.Global().Get("document")
    body := doc.Call("getElementById", "thebody")
    body.innerHTML = "Dynamic Content"
}

Когда я пытаюсь построить с помощью $ env GOOS=js GOARCH=wasm go build -o main.wasm, я получаю: ./wasm.go:14:6: body.innerHTML undefined (type js.Value has no field or method innerHTML)

Неудивительно, если подумать, но я не вижу примера в документе по адресу https://godoc.org/syscall/js, в котором объясняется, как получить и установить свойства элемента.


person Mike Ellis    schedule 24.10.2018    source источник
comment
1) Этот пакет является ЭКСПЕРИМЕНТАЛЬНЫМ. В настоящее время он предназначен только для запуска тестов, но еще не для предоставления исчерпывающего API для пользователей. 2) JS и DOM - это две разные вещи. Пакет JS позволяет вам вызывать функции JS, он не включает полную реализацию JS DOM на Go. 3) Размещенная вами вики-ссылка предлагает использовать github.com/dennwc/dom для манипулирования DOM. Ты это пробовал?   -  person Adrian    schedule 24.10.2018
comment
@ Адриан Спасибо. Я посмотрел библиотеку DOM. Это, вероятно, будет полезно позже, но мне нравится избегать дополнительных пакетов, пока я все еще делаю маленькие шаги. На данный момент ответ icza отвечает моим потребностям.   -  person Mike Ellis    schedule 24.10.2018


Ответы (1)


Чтобы получить значение любого свойства некоторого объекта JavaScript, используйте метод Value.Get(). метод (на самом деле вы уже использовали его, когда обращались к объекту документа, вызывая js.Global().Get("document")). Точно так же, чтобы установить значение свойства, используйте Value.Set().

Имя свойства, значение которого нужно получить/установить, представляет собой просто значение Go string, "innerHTML" в вашем случае. Устанавливаемое значение может быть многими из значений Go (например, string, целые числа, числа с плавающей запятой, bool, срезы, карты и т. д.), js.ValueOf() используется для получения js.Value(), который будет установлен в конечном итоге. В вашем случае вы можете просто использовать значение Go string "Dynamic Content".

doc := js.Global().Get("document")
body := doc.Call("getElementById", "thebody")
body.Set("innerHTML", "Dynamic Content")
person icza    schedule 24.10.2018
comment
Спасибо! Это сработало после того, как я исправил опечатку в последней строке. Должно быть body.Set вместо body.SetValue. - person Mike Ellis; 24.10.2018
comment
@MikeEllis Да, это body.Set(). Спасибо. - person icza; 24.10.2018