2026年6月18日木曜日

APEX 26.1で追加されたボタンの属性「無効として表示」を確認する

Oracle APEX 26.1でボタンの属性として「無効として表示」が追加されました。オンラインヘルプの説明は以下です。
定義されたサーバー側の条件がFALSEと評価される場合に、ボタンまたはメニュー・エントリを非表示にするのではなく、無効としてレンダリングするかどうかを指定します。

今ひとつピンとこなかったので、動作について確認してみました。

以下のようにページを作成し、ページ・アイテムP1_ITEM1P1_ITEM2の間にボタンBUTTONを配置します。


このとき、ボタンの外観無効として表示オフ(これが26.1以前の設定です)で、サーバー側の条件falseになるとき、ページは以下のように表示されます。ボタン要素は生成されず、ページにボタン要素が無いため、ページに表示されません。


このとき都合が悪いのは、ページのレイアウトが崩れることです。

APEX 26.1で新たに追加された無効として表示オンにすると、サーバー側の条件falseのときに、ボタンは無効の状態で表示されます。ページのレイアウトは変わりません。


サーバー側の条件でボタンを除外するのは、単に無効にするだけではなく、ボタンに紐づけた動作の呼び出しをブラウザから直接実行されるのを防ぐ効果があります。ボタン要素がページ上に存在しないので、JavaScriptコンソールから直接呼び出してクリックすることはできません。

レイアウトを崩さないようにするため、サーバー側の条件の代わりにページ・ロード時にボタンを無効化する動的アクションを作成できます。


このようにした場合、以下のように表示上は同じであり、ボタンはクリックできなくなっています。


しかし、動的アクション有効化を呼び出すか、それと等価な処理をブラウザ上で実行すると、ボタンを押せるようになります。


ボタンを押せるようになると、ブラウザのJavaScriptコンソールより以下のようなコードを実行することで、ボタンに紐づいたアクションを実行できます(ボタンにHTML DOM IDとしてmyButtonを割り当ててあります - 26.1から詳細静的IDHTML DOM IDという属性名に変わっています)。

document.getElementById("myButton").click();


ボタンの外観無効として表示オンとし、サーバー側の条件falseのときに表示されているボタンは、ボタンとして有効化しても、アクションを呼び出すことはできません。

ボタンを有効化すると見た目は有効に見えるようになりますが、画面上でボタンをクリックしても、JavaScriiptでclick()を呼び出しても、ボタンに紐づいたアクションは呼び出されません。


JavaScriptコンソールから以下を実行しても、動作しません。

document.getElementById("myButton").click();


サーバー側の条件による除外で期待されているセキュリティ面での要件を満たしつつ、ページ・レイアウトは崩さない設定になっています。

簡単なアプリケーションですが、動作確認に使用したAPEXアプリケーションのエクスポートを以下に置きました。


Oracle APEXのアプリケーション作成の参考になれば幸いです。