WT-Toolkit のグラフをIEでも表示できるようにする

IEでは動かないんですよ

前回の日記では、JavaScriptベースのグラフィックライブラリ WT-Toolkitを用いたグラフ作成のサンプルを紹介しました。

しかし、このサンプル、実はFirefox 2.0 以上でないと見れないはずです(Firefox のヴァージョンはうろ覚え)。少なくとも Internet Explorer では見れないはずです。実際、僕のマシンのIE 6.0 では、以下のようなエラーがでます。

エラー:予期しないメソッドの呼び出し、またはプロパティ アクセスです。

WT-Toolkit が生成するもの

なぜ、Firefox ではグラフが表示されて、IE では表示されないんでしょう?

図形の描画、Firefox では動く、IEでは駄目・・・


鋭い人なら原因はすぐに分かると思います。


結論から言ってしまえば、WT-Toolkit は、グラフを SVG [Scalable Vector Graphics] 形式で出力しているので、IEではデフォルトでは動作しません。

Firefox ユーザの方で、Firebug (高機能なデバッガ) を使ったことがあるのなら、グラフのHTMLを見てみてください。以下のような感じのデータが出力されているはずです。

<svg id="1" style="position: absolute;">
  <g id="1" transform="translate(0) />
    <text id="1" style="position: absolute;">Chart Title</text>
    <g id="1" transform="translate(31.2132, 180)"></g>
    <text id="1" style="position: absolute;">40</text>
  </g>
</svg>

FirefoxSVGIEVML

Firefox はネイティブで SVG をサポートしてくれています。それに対して、IEでは、SVGではなく、VML [Vector Markup Language] をサポートし、SVGには対応していません。一応、SVGが主流なので、IEは早めにSVGのネイティブサポートして欲しいですね。(^^;

SVGVML に渡して解決します

動いてるものを見る

では、IESVGを表示するようにサンプルを改良します。WT-Toolkit の公式サイトの Live Demo では、 IE でも問題なくグラフが表示されています。そこで、Live Demo のソースコードをちょっと拝借して、サンプルとの違いを探してみました。

どうやら、IESVG 形式のデータを表示するには、SVGのタグの処理を VML に代替させることで表示できるみたいです。

XMLNamespace を追加する

SVG の処理を VML に任せるためには、SVGVML等の XMLNameSpace を追加し、SVG 用のタグの振舞いをVMLで行わせるようにすることで、IEでもSVGを表示しているように見せることができます。

まず、HTMLタグにXMLNameSpaceを追加します。XMLNameSpace そのものの説明については、適宜、ググって下さい。

<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:v="urn:schemas-microsoft-com:vml"
  xmlns:o="urn:schemas-microsoft-com:office:office">

これで、svg, v, o タグの名前空間が宣言されました。次に、v, o タグの振舞いをVMLに任せるようにします。HEADタグ内に書いてください。

<style type="text/css">
  v\:* { behavior: url(#default#VML);}
  o\:* { behavior: url(#default#VML);}
</style>

実際は、style の指定はなくても表示されませんでしたが、念のために書いた方がいいです。

簡単にまとめ

  • WT-Toolkit は グラフを SVG 形式で出力
  • IEVML 派なので SVG は非サポート (Firefox はネイティブサポート)
  • SVG のタグを VML で処理するようにすることで、 IE でもグラフの表示が可能
  • そのためには XMLNameSpace (xmlns) を指定
  • VMLSVG に比べてかなり重い(Live Demo で体感)

⇒ (゚д゚)ウマー