IEとFireFoxでパーシングの仕方が違う!
FireFox対応版、解決編。
- XMLの各要素のアクセスにインデックスナンバーじゃなく文字列で指定したい。
実は、XMLの処理に関しても、FireFoxでは動かない所があって、結果的にこの処理をすることで解決したとゆー。
とりあえず、テスト用のサンプルを。
XMLファイルは以下のようになっています。
data.xml
<?xml version="1.0" encoding="UTF-8" ?> <pages> <page> <image>Do.jpg</image> <text>…………ちっちゃくないもん</text> </page> </pages>
このルートの要素数、つまり<pages>タグ内の要素数を取得します。
test.js
// ルートの要素数の取得。 var length = ajax.responseXML.documentElement.childNodes.length;
childNodesに「子ノード」が入っているので、その要素数をlengthで取得します。
<pages>タグの中には<page>タグしかないので、一見「1」になりそうですが、IEは「1」、FireFoxは「3」になります。
IEとFireFoxとでXMLHttpRequestで実装しているパーシング処理方法が違うらしく、FireFox版は「タグの間の空白やタブ」も数えちゃうみたいです。
この点について書いてあるところがありました。
ここを参考に、昨日のFireFox修正版では以下のようにしました。
test.js
// <page>を取得します。 var page = ajax.responseXML.documentElement.getElementsByTagName( "page" )[0]; // <image>の中身を取得します。 var imageUrl = page.getElementsByTagName( "image" )[0].childNodes[0].nodeValue; // イメージ置き換え先の取得。 var imageObj = document.getElementById( imageObjId ); // イメージを置き換えます。 imageObj.src = imageUrl;
話が前後しますが、要素をインデックスナンバーではなく文字列で取得するにはgetElementsByTagName()メソッドを使用します。
このメソッドでタグを直接指定できるので、空白やタブを取得することはありません。
このメソッドは、複数のタグが見つかった場合のために配列を返すので、[0]で最初のものだけ取得するようにします。
……ここまではいいんだが、正直、最後の「childNodes[0].nodeValue」はよくわからん(汗)。
型をちゃんと理解してないからっぽいなぁ。
次は「どれがどの型か」っていうのをちゃんとまとめることにします。
うはぁ、エロゲーからどんどん離れてく……。