JavaScript Examples
第29回 Textとloadの利用方法を確認する

 これまで主にDOM1のCoreという仕様を中心にサンプルを 使いながら解説してきたわけだが、今回のTextインターフ ェイスとDOM3のloadに関する説明をもってDOMについての 紹介は一旦終了する。Textは文字通り文字データであり loadは外部のXMLを読み込みDOMとして処理する重要なメソ ッドだ。




 今回でDOMの紹介を終わると言っても、これまでにDOM1-
Coreのすべてを紹介できたわけではなく、またDOM1-Core
自体もDOMのほんのさわりの部分に過ぎない。
 とはいえ、DOM2,DOM3を利用する時にDOM1-Coreを使える
ことは必須と言っても良いわけで、わからなくなった時には、
是非これまでのサンプルを動かしてみて欲しい。
 現在一般に使われているブラウザにはDOMが必ず実装さ
れており、それをJavaScriptで操作できるのは当り前とい
う時代になってきている。したがって、今後の連載の中で
も必要に応じてそれらの紹介は行って行くことになる。
 また、CD-ROM内にはDOMの各バージョンの仕様へのリンク
も用意されているので是非参考にして欲しい。
 さて、今回のTextインターフェイスはこれまでに紹介
してきたいろいろなインターフェイスの中のCharacterData
を表している。メソッドがひとつだけの簡単なインター
フェイスだ。そして、もうひとつのloadメソッドはDOM3
のものだがXMLファイルをダイナミックにロードし、今ま
で紹介してきたDOMの命令で処理することのできる便利な
メソッドだ。今回は、このloadメソッドのクロスブラウザ
な使い方を紹介したい。
 ページ構築後にも自由にXMLファイルをロードし処理で
きるloadメソッドは、今まで扱ってきたDOM命令でいきな
り簡単にワンランク上のサイトを構築できる魔法のメソッ
ド?といえるかもしれない。



今回のテーマのポイント
 1.Textインターフェイスの命令を確かめる  2.類似命令についての確認  3.DOM3のloadメソッドを使ってみる
splitTextとsplitとsubstringData Textインターフェイスのメソッドと類似命令について確認してみよう。 ■splitTextメソッド  Textインターフェイスは、Element や Attr に含まれるCharacterDataをあらわしている。  TextインターフェイスにはDOM1ではメソッド がひとつあるだけだ。Textノードを2つのText ノード分割にする「splitText」メソッドで、 分割する位置は引数でoffset指定し0から数え 始める方式だ。  たとえば、splitText(2)で「あいうえお」 という内容のTextノードを分割すると「あ」 を0、「い」を1、「う」を2と数えていって 3文字目である「う」の<<手前>>で分割されて、 「あい」と「うえお」という二つのノードが できあがる。分割されたノードは、offsetの 手前の地点「あい」までの内容だけを含むこと になり、offset以降の部分「うえお」は次の 兄弟ノードとして挿入されることになっている。  ただし、このようにタグなしで分割された TextノードはHTMLやXML的にはその分割状態を 表す方法がないのでDOM編集中には存在しても 永続性はないことに注意が必要だ。  ちなみに、normalizeメソッド(DOM1ではEle mentインターフェイスだったがDOM2からはNode インターフェイス)を使うとこの分割状態を解消 してひとつのTextノードに戻すことができる。 これは、DOM編集後にDOMツリーを辿る作業を したいなどといったときに編集中のツリーの 複雑さを解消する便利なメソッドだ。  まあ、何はともあれ、サンプルをみてみよ う。ボタンクリックするとTextノードが5文 字目で分割されるというものだ。  ボタンをクリックすると、「こんにちはお 元気ですか?」の「お」の手前で分割されて 対象のノードデータが「こんにちは」に変わ っているのがわかるだろう。


<script type="text/javascript"> <!--
function splitData(idName,index) {
  //1 id名がidNameのエレメントのfirstChildを変数fcへ入れる   var fc = document.getElementById(idName).firstChild
  //2 index文字目でTextノードを分割する   fc.splitText(index)
  //3 dataを調べる   alert(fc.data)
}
//--> </script> <p id="test0">こんにちはお元気ですか?</p> <form> <input type    = "button"          value   = "Textノードを5文字目で分割する"        onclick = "splitData('test0',5)"> </form> ( *indexは1文字目を0番目として数える。)

↑このスクリプトサンプル ./sample/f1.htm
【f1.htmの動作ブラウザ】        win mac linux n7 m1 e5 e6 o7 n7 m1 e5 s1 n7 m1 k3 ○ ○ ○ ○ ○ ○ ○ × ○ ○ ○ ○ ■setAttributeとsetAttributeNode  JavaScriptにはsplitというメソッドがあって 名前はにているが動作は異なっている。これは、 引数で文字列を分割した配列を返すものだ。  従来のJavaScript命令で比較するならむしろ、 指定された開始位置から終了位置にある文字 列を返すsubstringなどが似ているかもしれな い。たとえば、substring(0, 5)は文字列の 頭から5文字目までを取り出すので、上のサン プルに似た動作をするといえる。  しかし、substringが取り扱うのが文字列 そのもので、たとえば
  testStr = 'あいうえおです'   testStr.substring(0, 5)
のように直接文字列を扱う【サンプルf1_2.htm】 のに対して、splitTextはあくまでDOMのノー ドを対象にした処理なので、
  oj=document.getElementById('test')   testNode = oj.firstChild   testNode.splitText(5)
という具合にDOMを取り扱う時に便利なメソ ッドとなっている【サンプルf1_3.htm】。 【f1_2.htmの動作ブラウザ】       win mac linux n7 m1 e5 e6 o7 n7 m1 e5 s1 n7 m1 k3 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ 【f1_3.htmの動作ブラウザ】       win mac linux n7 m1 e5 e6 o7 n7 m1 e5 s1 n7 m1 k3 ○ ○ ○ ○ ○ ○ ○ × ○ ○ ○ ○  さらに、DOMの中にもsubstringDataという 似たようなメソッドがあるが、これは文字列 を取り出すだけでノードの分割までは行わな い。f3.htmのサンプルで確認してみよう。  こちらのノードデータはsubstringDataで 処理後も最初のままになっている。

<script type="text/javascript"> <!--
function test_substringData(idName,index) {
  //1 id名がidNameのエレメントのfirstChildを変数fcへ入れる   var fc = document.getElementById(idName).firstChild
  //2 substringDataで0番目から5文字取り出してみる   alert( fc.substringData(0,5) )
  //3 fcノードそのものは分割されていない   alert( fc.data )
}
//--> </script> <p id="test0">こんにちはお元気ですか?</p> <form> <input type    = "button"          value   = "文字列を5文字目で分割する"        onclick = "test_substringData('test0',5)"> </form>


↑このスクリプトサンプル ./sample/f2.htm
【f2.htmの動作ブラウザ】        win mac linux n7 m1 e5 e6 o7 n7 m1 e5 s1 n7 m1 k3 ○ ○ ○ ○ ○ ○ ○ × ○ ○ ○ ○ DOM3のloadメソッドについて DOM2以降に追加された命令のなかにもいろいろ使えるものがある ■メソッドload  これまで解説してきたDOM1ベースのJavaScript は外部ファイルとのアクセスには.jsファイルを 使うしかなかった。また、ページ構築後に読み込 もうと思ったらフレームを使ったり、ダイナミッ クロード用の特殊なクロスブラウザ関数などを 用意する必要もあった。            しかし、DOMにはXMLをダイナミックに読み書 きするためのDocumentLSインターフェイスがあ らかじめ用意されている。そのなかでもおなじ みなのがloadメソッドだ。このインターフェイ スが含まれるDOM3 - Load and Save は2003.6 .19付けでまだ草案だがload自体はIEのActiveX として実装されていたので使った事のある方も 少なくはないだろう。  今回は、これをIEだけではなくクロスブラウ ザで動かす方法を紹介しておく。  外部のXMLファイルを自由に読み込めること でこれまで紹介してきたさまざまな命令がいき なりダイナミックな処理能力を手に入れること になるからだ。  では、さっそくサンプルを見てみよう。 下記XMLファイルdata.xmlをボタンクリックで 読み込み、HTML内へ書き出すというものだ。
【load1/data.xml】(*文字エンコードはutf-8です) <?xml version="1.0"?> <root>   <node>むかしむかし</node>   <node>あるところに</node>   <node>おじいさんと</node>   <node>おばあさんが</node>   <node>とんでました。</node> </root>

【load1/load.htm】 <script type="text/javascript"> <!--
/*==========================================================  //クロスブラウザ load関数
  引数  : url    XMLファイルのurl           func   読み込み成功時の起動関数名   戻値  : 読み込まれたXMLノードツリー   例    : loadFile( 'data.xml', func1 )          function func1(){alert('test')}   Support http://game.gr.jp/js/ */
function loadFile(url,func) {   if (window.ActiveXObject)   {     var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")         xmlDoc.async = false         if(xmlDoc.load(url)){func(xmlDoc)}   } else if ( document.implementation &&                document.implementation.createDocument )   {     var xmlDoc = document.implementation.createDocument("","",null)         xmlDoc.onload = function (){func(xmlDoc)}         xmlDoc.load(url)   }   return xmlDoc }
//読み込んだXMLのデータをもとにHTMLへ書き出す function writeXMLData(xdoc) {
  //XML内の"node"という名前のタグの配列を作る   var wknode = xdoc.getElementsByTagName("node")
  //書き出すためのdivを作っておく   var wkaaa = document.body.insertBefore(         document.createElement("div"), document.body.firstChild)
  //"node"タグが出てきた順に処理する   for( i = 0 ; i < wknode.length ; i++ )   {     //各タグ内のfirstChildのデータだけをinnerHTMLで書き出す     wkaaa.innerHTML +=  wknode[i].firstChild.nodeValue + '<br>'   } }
//--> </script>
<input type   = "button"         value  = "XML読み込み"        onclick= "loadFile('data.xml',writeXMLData)">

↑このスクリプトサンプル ./sample/load1/load.htm
【load.htmの動作ブラウザ】         win mac linux n7 m1 e5 e6 o7 n7 m1 e5 s1 n7 m1 k3 ○ ○ × ○ × ○ ○ × × ○ ○ × 応用サンプル  Textインターフェイスやloadメソッドを使ってDOMを動的に変更するサンプルを作ってみた ◎ ./sample/sample1/text.htm   読み込んだXMLのデータを1行10文字に整形して表示する   loadで読み込んだXMLデータのTextノードを10文字でsplitTextし整形している。   splitTextするごとに短くなるlastChildの長さをチェックすることで文末で処理を停止する。 ◎ ./sample/sample2/loadjs.htm   読み込んだXMLのTextデータをもとにJavaScriptを実行する   XMLファイルの中にtextとしてJavaScriptを書いておき、loadで読み込んだあとに   evalで実行するという少しトリッキーなサンプル。   ここでは<script>タグを使っているがあくまでデータとして読み込んでいるだけ   なのでタグの名前は<hoge>でもなんでもかまわない。 ◎ ./sample/sample3/addr.htm   読み込んだXMLデータで住所リストを生成してみる      XMLデータをもとにしてHTMLを書き出す処理。ここでは簡単な出力をサンプルと   しているがこれまでに紹介したさまざまなDOM命令を使えば外部に置いたXMLファイルから   どんなHTMLでもダイナミックに自動生成できるのだ。 //////////////////////////////////////////////////////////////////// *上記サンプルの動作環境は各サンプルをご確認ください ==================================================================== 凡例 Win n3 -- NetscapeNavogator 3.x n4 -- NetscapeNavogator 4.x n6 -- NetscapeNavogator 6.x n7 -- NetscapeNavogator 7.x m1 -- Mozilla1.x e4 -- Internet Explorer 4.x e5 -- Internet Explorer 5.x e6 -- Internet Explorer 6.x o6 -- Opera 6.0 o7 -- Opera 7.0 Mac n3 -- NetscapeNavogator 3.x n4 -- NetscapeNavogator 4.x n6 -- NetscapeNavogator 6.x n7 -- NetscapeNavogator 7.x m1 -- Mozilla1.x e4.5 -- Internet Explorer 4.5 e5 -- Internet Explorer 5.0 または 5.1 s1 -- Safari Linux n3 -- NetscapeNavogator 3.x n4 -- NetscapeNavogator 4.x n6 -- NetscapeNavogator 6.x n7 -- NetscapeNavogator 7.x m1 -- Mozilla1.x k3 -- Konqueror 3.x --------------------------------------------------------------------




●JavaScript 資料




Toshirou Takahashi tato@fureai.or.jp