[mayaa-user:793] Re: mayaaプロセッサが当てられているタグ名を知りたい
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2009年 5月 29日 (金) 15:48:07 JST
To: 加藤さん
お世話になりますsusukiです。
ありがとうございます!
「originalNode.QName.localName」によるタグ名の取得と
対象HTMLタグの属性の取得に成功しました。
ServiceCycleインターフェースについても勉強になりました。
ただバージョン 1.1.23 のEclipse Project Zipを落として
ソースを見たところ、
org.seasar.mayaa.cycle.ServiceCycleインターフェース
の中にgetOriginalNode()はありましたが、
getOriginalNode()の戻り値の
org.seasar.mayaa.engine.specification.NodeTreeWalkerインターフェース
の中にはgetQName()は発見できませんでした。。
どういう仕組みでgetQName()が呼ばれているのか分かりません。
単純にメソッドを辿っている訳ではないのでしょうか?
ソースの見方が悪いだけでしたら申し訳ございません。
以上です。
> 加藤です。
>
> マニアックな使い方ではありますが、
> スクリプトから「originalNode.QName.localName」で、タグ名が参照できます。
> ただし、その時点で参照可能な直近の対象ノードであることに注意する必要があります。
> beforeRender内などでは正しい結果が得られません。
>
> また、「originalNode」だけ書いてしまうと、現行の1.1以降の全てのバージョンで、
> 最適化機能が有効な場合(デフォルト設定)に、無限ループするという不具合が見つかっております。
> この問題に対しては先ほど対策し、SVNのリビジョン(3440以降)で修正済みです。
> 「originalNode」だけ書くということをしない限りは、現行リリースバージョンでも
> 問題ないと思います。
>
> この originalNode は何者か?という点ですが、
> mayaaのソースに含まれる、org.seasar.mayaa.cycle.ServiceCycle インターフェースの
> getOriginalNode() メソッドに当たります。
> ServiceCycleインスタンスはページスコープ上に浮いています。
> 幾つかのメソッドは、プロセッサがネストするごとに異なる内容を返します。
>
> mayaaのドキュメントに記述している、グローバル関数の幾つかもServiceCycleインスタンスの
> メソッドで提供されています。
>
> rhinoは、Javaオブジェクトのアクセッサをフィールドのように参照するので、
> originalNodeは、(ServiceCycleのインスタンス).getOriginalNode() が呼ばれます。
>
> 「getOriginalNode().getQName().getLocalName()」でもタグ名の参照が可能です。
> ただ、長くなるだけですので冒頭にあげた記述の方が良いでしょう。
>
>
> おまけとして、対象HTMLタグの属性を取得する方法も以下に示します。
> --------
> <m:beforeRender>
> <![CDATA[
> var QNameImpl =
> Packages.org.seasar.mayaa.impl.engine.specification.QNameImpl;
>
> function getHtmlAttribute(htmlNode, name) {
> var attr = htmlNode.getAttribute(
> QNameImpl.getInstance(htmlNode.QName.namespaceURI, name));
> if (attr != null) {
> return attr.value;
> }
> return undefined;
> }
> ]]>
> </m:beforeRender>
>
> <m:write id="write"
> value="${
> originalNode.QName.localName
> + ' class='
> + getHtmlAttribute(originalNode, 'class') }"/>
> --------
>
>
>
>> お世話になっておりますsusukiです。
>>
>>> これだと代替手段はありませんね。
>> 了解しました。
>>
>>> ただ、タグの種類が異なるのであれば、プロセッサは別にする方が
>>> 自然だと思います。
>> テンプレートHTMLは開発者ではない人が作ることを想定しています。
>> テキストボックスとテキストエリアに初期表示をするのは
>> 画面表示的には同じように見えるので
>> 同じidでできた方が親切かなと思い、mayaaプロセッサで違いを
>> 吸収してあげたかったというのが目的でした。
>> でもプロセッサは分けていきたいと思います。
>> テンプレート作成者に少し注意して頂ければ済みますし。
>>
>>> HTML の id は、複数のタグで同じ値を持つことを許していませんので、
>>> m:id を使うようにした方が良いかもしれません。
>>>
>>> バリデーションにひっかかる、JavaScript から id 指定で呼べない、
>>> くらいの問題があります。
>> ありがとうございます。
>> 検討してみます。
>>
>>
>> 迅速で丁寧な対応で助かりました!
>> また何かありましたらよろしくお願いします!
>>
>> 以上です。
>>
>>> suga です。
>>>
>>> 2009/5/26 [E-MAIL ADDRESS DELETED] <[E-MAIL ADDRESS DELETED]>:
>>>>> どういった場合にタグ名を取得したいのでしょうか。
>>>>> 場合によっては代替手段があるかもしれません。
>>>> inputタグでもTEXTAREAタグでも、同じid設定で
>>>> 初期表示を行いたいのです。
>>>>
>>>> inputタグとTEXTAREAタグでは初期表示させる場合
>>>> Mayaaプロセッサの書き方が変わりますので
>>>> プロセッサ内でタグ名を取得して分岐する必要が
>>>> あると考えました。
>>>> ドキュメントにはそれらしい使い方が
>>>> 載っていなかったので質問させて頂いた次第です。
>>> これだと代替手段はありませんね。
>>>
>>> ただ、タグの種類が異なるのであれば、プロセッサは別にする方が
>>> 自然だと思います。
>>> (もうちょっと広い範囲が分かると意見が変わるかもしれませんが)
>>> 値を取得するのに記述が多いような場合は、beforeRender でまとめて
>>> おくか、Java でユーティリティを作るかすると良いでしょう。
>>>
>>>
>>> 余談ですが、
>>>
>>>> ***********HTMLコード***********
>>>> <input type="text" id="setDefaultValue" />
>>>>
>>>> <TEXTAREA id="setDefaultValue"></TEXTAREA>
>>> HTML の id は、複数のタグで同じ値を持つことを許していませんので、
>>> m:id を使うようにした方が良いかもしれません。
>>>
>>> バリデーションにひっかかる、JavaScript から id 指定で呼べない、
>>> くらいの問題があります。
>>>
>> _______________________________________________
>> mayaa-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>
>
> _______________________________________________
> mayaa-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/mayaa-user
mayaa-user メーリングリストの案内