Как я могу получить доступ к свойствам элемента 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 примера, объясняющего, как получить и установить свойства элемента.

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

Adrian 24.10.2018 17:18

@ Адриан Спасибо. Я посмотрел библиотеку DOM. Вероятно, это будет полезно позже, но я предпочитаю избегать лишних пакетов, пока я все еще делаю маленькие шаги. На данный момент ответ icza соответствует моим потребностям.

Mike Ellis 24.10.2018 17:49
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
2
1 959
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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")

Спасибо! Это сработало после того, как я исправил опечатку в последней строке. Должен быть body.Set вместо body.SetValue.

Mike Ellis 24.10.2018 17:43

@MikeEllis Да, это body.Set(). Спасибо.

icza 24.10.2018 17:50

Другие вопросы по теме