ホワイトスペースの除外
DOMのchildNodes、previousSibling、nextSiblingプロパティは、internet Explorerではホワイトスペースノードを除外しますが、他のブラウザではそのまま返されます。
他のブラウザでもIEと同様にホワイトスペースノードを除外するように書き換えます。
childNodesの書き換え
function XchildNodes(node) {
var array = new Array();
if( ! node ) { return array; }
if( ! node.hasChildNodes() ) { return array; };
var children = node.childNodes;
for( var i=0; i
previousSiblingの書き換え
function XpreviousSibling(node) {
if( ! node ) { return null; }
// 直前のノードをチェック
var o = node;
var p;
while( p = o.previousSibling ) {
if(p.nodeType == 3) {
// テキストを取り出す
var text = p.nodeValue;
// テキストがホワイトスペースだけから構成されていれば除外
if( ! text.match("/[^\s\t\n\r]/") ) {
o = p;
continue;
}
}
return p;
}
return null;
}
nextSiblingの書き換え
function XnextSibling(node) {
if( ! node ) { return null; }
// 直後のノードをチェック/
var o = node;
var p;
while( p = o.nextSibling ) {
if(p.nodeType == 3) {
// テキストを取り出す
var text = p.nodeValue;
// テキストがホワイトスペースだけから構成されていれば除外
if( ! text.match("/[^\s\t\n\r]/") ) {
o = p;
continue;
}
}
return p;
}
return null;
}
テキスト取得
タグが含まれているHTMLコードからタグを抜き取ってテキストとして抜き出す場合は、DOM Level 3で規定されたtextContentを使うことができます。
FirefoxとOperaはこのプロパティに対応しています。
Internet ExsplorerとSafariでは代わりにinnerTextプロパティを使用します。
Netscape7のようにどちらの機能も持たないブラウザでは、DOM Level 1の機能を使用します。
function XtextContent(node) {
var text = "";
if(! node) { return text; }
if(typeof node.textContent != "undefined") {
// DOMのtextContenプロパティを使用
text = node.textContent;
} else if(typeof node.innerText != "undefined") {
// IEのinnerTextプロパティを使用
text = node.innerText;
} else if( node.hasChildNodes() ) {
// どちらでもない場合、DOM Level1の手法を利用
for (var i = node.childNodes.length; i--;) {
var o = node.childNodes.item(i);
if(o.nodeType == 3) {
text = o.nodeValue + text;
} else {
// 再帰処理
text = XtextContent(o) + text;
}
}
}
return text;
}
イベント・リスナーのセット/リセット
設定
Internet ExplorerではaddEventListenerメソッドの代わりにattachEventメソッドを使用。
function XaddEventListener(elm, type, func, useCapture) {
if(! elm) { return false; }
if(! useCapture) {
useCapture = false;
}
// W3C DOM準拠のブラウザ
if(elm.addEventListener) {
elm.addEventListener(type, func, false);
// Ingernet Explorer用
} else if(elm.attachEvent) {
elm.attachEvent('on'+type, func);
} else {
return false;
}
return true;
}
解除
Internet ExplorerではremoveEventListenerメソッドの代わりにdetachEventメソッドを使用。
function XremoveEventListener(elm, type, func, useCapture) {
if(! elm) { return false; }
if(! useCapture) {
useCapture = false;
}
// W3C DOM準拠のブラウザ
if(elm.removeEventListener) {
elm.removeEventListener(type, func, false);
// Ingernet Explorer用
} else if(elm.detachEvent) {
elm.detachEvent('on'+type, func);
} else {
return false;
}
return true;
}