Tsutomu Yano
t_yano****@me*****
2012年 3月 6日 (火) 20:12:41 JST
矢野です。 うまく再現しないですねえ… サンプルをこっちで動かしてみましたが、alertでは Wicket.$$(this) は true を返しますね。 説明によると、最終的にはsetTimeoutに渡すようなので、setTimeout も使ってみたんですが、やっぱり Wicket.$$(this) は true を返しますねえ… this を変えるために、var hoge = function() {... のところを var hoge = { myfunc: function() {... などと、this が別オブジェクトになるようにしたりもしてみましたが、やっぱり true になるんですよね。 コードはこんな感じです。 public class MyAjaxCallDecorator extends AjaxCallDecorator { private static final long serialVersionUID = 1L; @Override public CharSequence decorateOnSuccessScript(Component c, CharSequence script) { return "alert(Wicket.$$(this));"; } @Override public CharSequence decorateScript(Component c, CharSequence script) { StringBuilder builder = new StringBuilder(); builder.append("var hoge = function() {"); builder.append(script); builder.append("};"); builder.append("setTimeout(hoge, 10)"); return builder.toString(); } } 実行可能なコードもgithubから取得できます。 https://github.com/tyano/wicket15-snippet git が使えない場合でも、左上あたりにある「ZIP」ってボタンを押すと、zipファイルをダウンロードできます。 jp.javelindev.wicket.decorator というパッケージ化にいろいろ入っています。 このコードでは再現しないんですよねえ。なにかが違うのだと思うのですが。。 --------------------------------------------------- 矢野 勉(やの つとむ) 電子メール: t_yano****@me***** --------------------------------------------------- On 2012/03/05, at 23:46, maga****@hagan***** wrote: > 船田です。 > > ありがとうございます。 > > 最初は同じように、セキュリティ的な意図かと思いましたが > どうも、thisがDOMエレメント以外を指したりしているっぽいので… > > 少し極端な例ですがサンプルを作りました。 > > public class MyAjaxCallDecorator implements IAjaxCallDecorator { > > @Override > public CharSequence decorateScript(Component component, CharSequence script) { > StringBuilder builder = new StringBuilder(); > > builder.append("var hoge = function(){"); > //builder.append("alert(Wicket.$$(this));"); > builder.append(script); > builder.append("};"); > builder.append(" hoge();"); > return builder.toString(); > } > …… > > } > > 出力するjavascriptを匿名関数で括った > IAjaxCallDecoratorを実装しTextFieldに追加しています。 > > new TextField<String>("param", new Model<String>(inputText)) { > @Override > protected void onInitialize() { > super.onInitialize(); > add(new AjaxFormSubmitBehavior("onchange") { > @Override > protected IAjaxCallDecorator getAjaxCallDecorator() { > return new MyAjaxCallDecorator(); > } > …… > }); > } > } > > 何がやりたいのかと言いますと、 > Ajax開始前にやりたい処理(ページのロックとか)を > scriptの前に挟んでhogeをタイマーに渡したいのです。 > > そもそもIAjaxCallDecoratorの > 使い方が間違っているのでしょうか? >