diff --git a/docs/go-webassembly/index.html b/docs/go-webassembly/index.html index 3f38378..8083037 100644 --- a/docs/go-webassembly/index.html +++ b/docs/go-webassembly/index.html @@ -310,9 +310,10 @@
getElementById
でHTMLの要素を取得する部分は、2_dom
のサンプルとあまり変わりはありません。しかし、このサンプルでは取得したHTMLの要素にクリックイベントのリスナーを設定しています。
クリックイベントをハンドリングするには、JavaScriptで書いた例と同様に、addEventListener
メソッドを呼び出し、クリックイベントのイベントリスナーとしてコールバック関数を登録する必要があります。
コールバック関数は、Goの世界の関数をJavaScriptの世界の関数としてaddEventListener
メソッドに渡す必要があるため、単純なGoの関数ではなく、syscall/js
パッケージのjs.Callback
型として定義する必要があります。js.Callback
型の値は、js.NewCallback
関数を用いることで作成することができます。作成したコールバック関数はaddEventListener
メソッドの引数として渡しています。
コールバック関数は、Goの世界の関数をJavaScriptの世界の関数としてaddEventListener
メソッドに渡す必要があるため、単純なGoの関数ではなく、syscall/js
パッケージのjs.Func
型として定義する必要があります。js.Func
型の値は、js.FuncOf
関数を用いることで作成することができます。作成したコールバック関数はaddEventListener
メソッドの引数として渡しています。
main
関数の最後にあるselect{}
はmain
関数をブロックする役目があります。JavaScript側で発生したクリックイベントは、syscall/js
パッケージで管理されているイベントループに通知されます。
イベントループのゴールーチンはmain
関数が動いているゴールーチンは別ですが、main
関数のゴールーチンが終わってしまうとGoで書いたプログラム自体が終了するため、イベントループのゴールーチンも一緒に終了してしまいます。Goのプログラムが終わってしまうとJavaScript側はイベントをハンドリングしてくれる相手がいないため、エラーを発生させます。
ここではクリックイベントについて紹介しましたが、その他のイベントについても同様にハンドリングすることができます。また、preventDefault
などの処理をしたい場合には、js.NewEventCallback
関数を用いるとよいでしょう。