[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 メーリングリストの案内