ButtonとLinkのonclickにJavaScriptを埋め込む

はじめに

 今日たまたま「Wicket JavaScript」までgoogleに入力したところ「Wicket JavaScript 実行」と補完されました。
Wicket JavaScript 実行」と入力されている方々が正確何を求めているのか、正確な所は分かりませんが、ButtonとLinkのonclickにJavaScriptを仕込む方法を書きます。
 いや、私も以前探したので…。

環境

Button又はLinkのonclickにJavaScriptを仕込む方法

以下のメソッドをオーバーライドします。

クラス オーバーライドするメソッド
Button getOnClickScript()
Link getOnClickScript(final CharSequence)

 動的に生成する内容がなければ、HTML側に直接書いてもいけると思います(実験していませんが)。  なぜなら、ButtonとLinkは、onComponentTag(ComponentTag)でonclick属性を通常は上書きしないからです。
 前述したメソッドをオーバーライドした場合は、onclick属性を上書きします。

Linkの実装例

 Buttonの方の実装例は意外なことに、Wicket1.3.6のサンプルについてません。
 Linkの方は実装例がついています。サンプルのパスは以下の通り。

 該当部分を引用します。

add(new Link("link")
{
    /**
     * Handles a click on the link. This method is accessed normally using a standard http
     * request, but in this example, we use Ajax to perform the call.
     */
    public void onClick()
    {
        // Increment count
        count++;

        // The response should refresh the label displaying the counter.
        getRequestCycle().setRequestTarget(new ComponentRequestTarget(counter));
    }

    /**
     * Alter the javascript 'onclick' event to emit the Ajax call and update the counter
     * label.
     */
    protected String getOnClickScript(String url)
    {
        return new AppendingStringBuffer("new Ajax.Updater('counter', '").append(
                urlFor(ILinkListener.INTERFACE))
                .append("', {method:'get'}); return false;").toString();
    }
});

Button又はLinkについて、onclick以外の場合

 onclick以外の場合は、SimpleAttributeModifierを使って差し込むか、HTML側に直接書いてしまいましょう。

ButtonとLink以外のonclickについて

 onComponentTag(final ComponentTag)の実装を見てみましょう。
 「tag.put("onclick", 〜);」の箇所がonclick属性に値を設定している箇所です。
 と言うことを踏まえつつソースを読むと、差し込む方法の察しがつくはず。

 場合によっては、onComponentTag(final ComponentTag)をオーバーライドするという、泥臭い答えにたどり着くこともあるかと思いますが…。

 ちなみに、単純に「tag.put("onclick", 〜);」が呼ばれている場合、HTML側に書いたJavaScriptは無かったことにされます。
 要注意。

onloadを使いたい場合

 IHeaderContributorのJavaDocを読むと方法が書いてあります。

 JavaDocに書かれているサンプルを以下に抜粋します。

 class MyPanel extends Panel implements IHeaderContributor
 {
    public MyPanel(String id)
    {
        super(id);
    }
 
    public void renderHead(IHeaderResponse response)
    {
        response.renderOnLoadJavascript("alert('page loaded!');");
    }
 }

 余談ですが、Wicket 1.5では微妙に書き方が変わっているので注意してください
 Wicket 1.5のIHeaderContributorのJavaDocをみると、Wicket 1.5の場合の書き方が載っています。

さいごに

 業務アプリですと、JavaScript差し込むことよくありますものね。
 困っている人の助けになれば幸いです。