なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこ3で部品の「変更した時」を実装する

セレクトボックスの「変更した時」

セレクトボックスで何かを選んだ時に何かを実行したい場合があると思います。
クリックした時だと開いた時にもイベントが発生するので使い勝手が悪い……

//とても使い勝手が悪い例
「あああ,いいい,ううう,えええ」「,」区切る
DOM部品それセレクトボックス作成
DOM部品クリックした時  //開いた時にも反応する
    対象からテキスト取得して表示
ここまで

現状、なでしこ3には「変更した時」という命令がありません(v3.3.18時点)
セレクトボックスは変更した時に「change」というイベントが発生するので、DOMイベント発火時命令をつかって実装します。
こういうイベントが発生することをイベントが発火すると表現するそうです。

//セレクトボックスの変更した時
「あああ,いいい,ううう,えええ」「,」区切る
DOM部品=それセレクトボックス作成
DOM部品「change」DOMイベント発火時
  対象からテキスト取得して表示
ここまで

以下のDOM部品は変更した時「change」が発生するので同じ書き方ができます。

セレクトボックス、エディタ、チェックボックス、値指定バー、色選択ボックス、日付選択ボックス

「change」がDOMイベント発火時にはと書くとクリックした時と違って、キーボードによる変更にも反応してくれます。

changeイベント? onchangeイベント?

部品のイベント名はjavascriptの解説サイトから調べるのですが、「change」のように「on」がつかない解説サイトと「onchange」のように「on」がついた解説サイトがあります。

DOMイベント発火時に対応するのはonがつかないほうです。

プログラムによる変更とchangeイベントの関係

プログラムによる値の変更ではchangeイベントは発生しないようです。

//プログラムからバーの値を変更してもchangeイベントは発生しない
DOM部品[0,5]値指定バー作成
DOM部品「change」DOMイベント発火時
    対象からテキスト取得して表示
ここまで
1秒後
    DOM部品5テキスト設定  //値は変わるがイベントは起きない
ここまで

値指定バー(ブラウザごとに見た目が違うらしい)

change以外のイベントの例

画像(画像作成・imgタグ)や動画(videoタグ)は「src」属性でロードするファイルを変更するのですが、 ファイルの情報(縦横のサイズなど)はロードがある程度、またはロードが全部完了しないと取得できません。

例えば……
動画の長さは「duration」をDOM属性取得すると得られます。
ただし、videoタグにsrcを設定後すぐに動画の長さ(duration)を取得しようとすると失敗します。

//失敗する例
ビデオタグ=「video」DOM部品作成
ビデオタグ「src」「tetris.mp4」DOM属性設定
ビデオタグ「duration」DOM属性取得して言う //duration…動画の長さ

videoタグの場合、情報を取得できるところまでロードできたよ!って時にloadedmetadataイベントが発生します。
このイベントが発生した後なら動画の長さを取得できます。

//ロードを待って情報を取得する例
ビデオタグ=「video」DOM部品作成
ビデオタグ「loadedmetadata」DOMイベント発火時
  対象「duration」DOM属性取得して言う //duration…動画の長さ
ここまで
ビデオタグ「src」「tetris.mp4」DOM属性設定

先にsrcを変更するとイベント発生が先に起きてしまう可能性があるので、DOMイベント発火時を記述してからsrcを設定します。