ButtonとLinkのonclickにJavaScriptを埋め込む
はじめに
今日たまたま「Wicket JavaScript」までgoogleに入力したところ「Wicket JavaScript 実行」と補完されました。
「Wicket JavaScript 実行」と入力されている方々が正確何を求めているのか、正確な所は分かりませんが、ButtonとLinkのonclickにJavaScriptを仕込む方法を書きます。
いや、私も以前探したので…。
環境
- Wicket 1.3.6
Button又はLinkのonclickにJavaScriptを仕込む方法
以下のメソッドをオーバーライドします。
クラス | オーバーライドするメソッド |
---|---|
Button | getOnClickScript() |
Link | getOnClickScript(final CharSequence) |
動的に生成する内容がなければ、HTML側に直接書いてもいけると思います(実験していませんが)。
なぜなら、ButtonとLinkは、onComponentTag(ComponentTag)でonclick属性を通常は上書きしないからです。
前述したメソッドをオーバーライドした場合は、onclick属性を上書きします。
Linkの実装例
Buttonの方の実装例は意外なことに、Wicket1.3.6のサンプルについてません。
Linkの方は実装例がついています。サンプルのパスは以下の通り。
- apache-wicket-1.3.6\src\jdk-1.5\wicket-examples\src\main\java\org\apache\wicket\examples\ajax\prototype\Index.java
該当部分を引用します。
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の場合の書き方が載っています。