Я пытаюсь расширить пример «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 примера, объясняющего, как получить и установить свойства элемента.
@ Адриан Спасибо. Я посмотрел библиотеку DOM. Вероятно, это будет полезно позже, но я предпочитаю избегать лишних пакетов, пока я все еще делаю маленькие шаги. На данный момент ответ icza соответствует моим потребностям.
Чтобы получить значение любого свойства некоторого объекта 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")
Спасибо! Это сработало после того, как я исправил опечатку в последней строке. Должен быть body.Set
вместо body.SetValue
.
@MikeEllis Да, это body.Set()
. Спасибо.
1) «Этот пакет является ЭКСПЕРИМЕНТАЛЬНЫМ. Его текущая сфера деятельности - только разрешение запускать тесты, но еще не предоставление полного API для пользователей». 2) JS и DOM - две разные вещи. Пакет JS позволяет выполнять вызовы функций JS, он не включает полную реализацию Go JS DOM. 3) В опубликованной вами вики-ссылке предлагается использовать github.com/dennwc/dom для манипуляции с DOM. Ты пробовал это?