ホワイトスペースの除外

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<children.length; i++ ) { var c = children.item(i); // テキストノードかをチェック if(c.nodeType == 3) { var text = c.nodeValue; // テキストがホワイトスペースだけから構成されていれば除外 if( ! text.match("/[^\s\t\n\r]/") ) { continue; } } array.push(c); } /* nodeListのitemメソッドをエミュレート */ array.item = function(n) { if(array[n]) { return array[n]; } else { return null; } } return array; }

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; }