読者です 読者をやめる 読者になる 読者になる

不要なテキストノードの除去

JavaScript

li要素などを改行すると、要素と要素の間に半角スペース分の余白が現れる件について調べてみた。 | Blog hamashun.com関連の、にツッコミしてみる。
innerHTMLの書き換えはaddEventListenerしたイベントが消えたりするのと、 Manabuさんの実装だとli要素の中の改行なども除去してしまうので意図しない動作(例えばliの中にpreがあったとき)をしてしまう可能性がある。

というわけで改案。

(function(){
var ols = document.getElementsByTagName('ol');
var TEXT_NODE = document.TEXT_NODE || document.createTextNode("").nodeType;
for (var i =0,l=ols.length;i<l;i++) {
    var ol = ols[i];
    for (var j = 0; j < ol.childNodes.length; j++) {
        if (ol.childNodes[j].nodeType === TEXT_NODE) ol.removeChild(ol.childNodes[j--]);
    }
}
})();

上のサンプルではol要素の直接の子要素であるテキストノードを除去しています。
childNodesは1つ除去すると以降の要素が前にずれるので、removeしたらインデックスを1つ戻してあげる必要があります。

もしくは、whileループとnextSiblingを使ったほうがスマートかもしれません。

(function(){
var ols = document.getElementsByTagName('ol');
var TEXT_NODE = document.TEXT_NODE || document.createTextNode("").nodeType;
for (var i =0,l=ols.length;i<l;i++) {
    var ol = ols[i];
    var st = ol.firstChild;
    while (st.nextSibling) {
        if (st.nextSibling.nodeType === TEXT_NODE) {
            ol.removeChild(st.nextSibling);
        } else {
            st = st.nextSibling;
        }
    }
}
})();