SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

XML Binding Language 2.0でアプリケーションを簡素化する

レイアウトとコードの簡素化に役立つバインディング言語としてのXML

 バインディングを機能させるために、一時的なHTMLツリーが構築され、XBLバインディングコードの制御下に置かれます。「shadowTree」と呼ばれるこのツリーには、バインディングドキュメントオブジェクトモデル(DOM)の実際の作業用コピーが格納され、境界要素のプロパティになります。shadowTree内の要素を取得するには、documentではなくthisgetElementByIDのルートクラスにします。例えば次の行では、feedbuttonオブジェクトを取得しています。

this.shadowTree.getElementById('feedbutton').addEventListener('click', this.getFeed, false);

 ここではboundElementプロパティをthisオブジェクトポインタに手動で関連付けています。これは、どのオブジェクトを参照しているかをより明白にするためです(特に、thisには異なるコンテキスト内の異なる値を持たせることができるためです)。

 一方、getFeed()関数は、フィードボタンが押下されたときのハンドラとして特に割り当てられており、バインディング内の実際の処理の大部分を実行します。この関数はTwitterアカウントのユーザー名とパスワードを取得した後、XMLHttpRequestを実行してフィードをJSONオブジェクトとして取得します。要求はサーバプロキシに対して行われ(下ではXQueryで記述していますが、任意の言語で記述できます)、サーバプロキシが実際にTwitter.comからTwitterのフィードを取り込んで、それをTwitter.xhtmlページの送信元である同じサーバ上のクライアントに渡します。新しいクロスドメイン対応のXMLHttpRequest()呼び出しの実装がいくつかありますが、まだ技術が新しすぎてあまり広く採用されていないので、プロキシサーバを使います。

 JSONとして取得し、「ツイート」というくだけた名前で呼ばれる状態メッセージの配列に変換した後、getFeed()関数はセットに対して反復処理を行い、tweet.idプロパティを取得します。そして、これをTwitterパネルテーブルの既存のペインと比較します。IDが既存のオブジェクトと一致した場合、新しいツイートは削除されます。一致しない場合は、新しいツイートがツイートスタックの先頭に追加され、古いメッセージが押し下げられます。そこからは、テキストがクリーンアップされ(受信ストリームは、特に&記号や関連する構造に関して、必ずしもHTMLになじむものばかりではありません)、画像、名前、テキストがすべてツイートにまとめられて表示されます。

 タイムアウトやその他のスレッド化されたイベントなど、メソッドの非同期呼び出しを処理する場合はバインディングの操作が難しくなることがあるので、関連するコンテキストを適切なハンドラに渡すのにクロージャが役に立ちます。この例では、getFeed()が呼び出されると、setTimeout呼び出しも起動されます。setTimeoutは、@interval属性で指定された間隔でメソッドを繰り返し呼び出します。デフォルトでは、間隔は30秒に設定されます。@intervalを0に設定すると、この呼び出しが無視されて更新機能が無効になります。

 <handlers>セクションでは、XBLバインディング全体の汎用のイベントハンドラを指定します。この例では何も指定していませんが、一般的なXBLハンドラは次のようなものです。

<xbl xmlns="http://www.w3.org/ns/xbl">
 <binding id="events">
  <handlers>
   <handler event="click" phase="default-action"
            button="1" click-count="1" modifiers="none"
            trusted="true">
    this.activate();
   </handler>
   <handler event="keypress" phase="default-action"
            key="Enter" modifiers="none"
            trusted="true">
    this.activate();
   </handler>
   <handler event="DOMActivate" phase="default-action">
    if (event.target == this.boundElement)
      this.boundElement.ownerDocument.location.href = this.href;
   </handler>
  </handlers>
  ...
  <!-- it is assumed that the implementation for this binding
       implements a .activate() method that fires the DOMActivate
       event on itself. -->
 </binding>
</xbl>

 一般に、こうしたイベントハンドラは、関連するJavaScriptハンドラスクリプトを包むラッパーです。また、これらはドキュメント全体ではなく、バインディング内のドメインにのみ適用されることにも注意してください。

 リソースでは、スタイルシートの使用、およびバインディング自体で使用される外部メディアリソース(画像、音声、ビデオなど)の両方を扱います。Twitterコンポーネントの場合、コンポーネントを制御するスタイルシートはインラインで次のように表現されています。

<resources>
   <style><![CDATA[
      td.tweet_cell {
         background-color:#E0E0FF;
         border:outset 2px;
         font-family:Arial;
         font-size:9pt;}
      #container {overflow-y:auto;
         display:block;
         width:400px;
         height:500px;}
   ]]></style>
</resources>
</pre></code>
<p>
The same stylesheet could also be referenced as an external file via the [xml]@src[/xml] attribute.
<p>
<pre><code>
<resources>
   <style src="twitter.css"/>
</resources>

 <resources>の一部である<prefetch>要素は、<img>や類似のHTML(または関連)要素に割り当てられるメディアリソースのプリロードを実行します。プリロードを実行することで、バインディングが最初に描画される前に、必ず画像が自動的にロードされるようになります。<prefetch>の構文は次のように簡単明瞭です。

<resources>
   <prefetch src="myImage.jpg" id="myImage"/>
</resources>

 src(必須)とid(省略可能)を指定します。W3CのXBL 2の仕様では、このようなリソースをプリフェッチおよび参照する方法の例が示されています。

<xbl xmlns="http://www.w3.org/ns/xbl"
     xmlns:html="http://www.w3.org/1999/xhtml">
 <binding id="light">
  <template>
   <html:img id="l" src="red.png" alt=""/>
  </template>
  <resources>
   <prefetch src="red.png"/> <!-- this one isn't necessary, since
    the UA will fetch this one as soon as it sees the <html:img> element -->
   <prefetch src="green.png"/>
  </resources>
  <implementation>
   ({
      red: function() {
        this.shadowTree.getElementById('l').src = 'red.png';
      },
      green: function() {
        this.shadowTree.getElementById('l').src = 'green.png';
      },
   })
  </implementation>
 </binding>
</xbl>

次のページ

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Kurt Cagle(Kurt Cagle)

ライター、情報アーキテクト、XML News NetworkとMetaphorical Webのウェブマスター。カナダ、ブリティッシュコロンビア州のビクトリア在住。XMLToday.orgの編集長、O'Reilly Mediaの寄稿編集者。現在、XBRLに関する著書を執筆中。彼のTwitterはtw...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4907 2010/03/01 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー