[OK]を、よく私はので、私はここに私の解決策を置くそれを自分で解決しました。私は文字列としてhtmlではなくDOMを扱うことにしました。そして最後のステップとしてinnerHTMLをつかむことができます。コードは少し大きめですが、考え方は次のとおりです。
要素のDOMツリーを歩き、各ノードのデータを配列(つまり、ツリーではなく線形)に保存します。要素ノードでは、開始タグと終了タグに等しい "startelem"と "endelem"の両方を配列に格納します。また、各要素の計算された「表示」プロパティ(インライン、ブロックなど)をメモし、配列の両方の項目にその要素を配置します。 (すべてのノードについて、ツリーに深さも格納しますが、これを使用する必要はありません)。
テキストノードの場合は、それが通常のテキストノードであるか、すべての空白であるか、空の文字列であるかどうかを確認してください。
「空白」テキストノードでは、配列内の前後の項目を見てください。いずれかがdisplay:inlineの場合、ノードは単一のスペースのままにします。そうでない場合は、テキストノードを空の文字列に変更します。
その後、要素のinnerHTMLを実行すると余分なスペースがなくなり、要素のブラウザの外観は変更されません。
var stripUnneededTextNodes= function (elem) {
var array = [];
addNodeAndChildrenToArray(elem, 1, array);
for (var i=1; i<array.length-1; i++) {
if (array[i].type == "whitespace") {
if (array[i-1].display == "inline" && array[i+1].display == "inline") {
array[i].node.nodeValue = ' ';
}
else {
array[i].node.nodeValue = '';
array[i].killed = true;
}
delete array[i].node;
}
else if (array[i].type == "text") {
var val = array[i].node.nodeValue;
if (val.charAt(0) == ' ' && array[i-1].display != "inline") {
array[i].node.nodeValue = val = val.substring(1);
}
if (val.charAt(val.length-1) == ' ' && array[i+1].display != "inline") {
array[i].node.nodeValue = val.substring(0, val.length-1);
}
delete array[i].node;
}
}
};
var addNodeAndChildrenToArray = function (node, depth, array) {
switch (node.nodeType) {
case 1: { // ELEMENT_NODE
var display = document.defaultView.getComputedStyle (node, null).display;
array.push ({type: "startelem", tag: node.tagName, display: display, depth: depth});
if (node.childNodes && node.childNodes.length != 0) {
for (var i=0; i<node.childNodes.length; i++)
addNodeAndChildrenToArray(node.childNodes.item(i), depth+1, array);
}
array.push ({type: "endelem", tag: node.tagName, display: display, depth: depth});
}
break;
case 3: { //TEXT_NODE
var newVal = node.nodeValue.replace(/\s+/g, ' ');
node.nodeValue = newVal;
if (newVal == ' ')
array.push ({type: "whitespace", node: node, depth: depth});
else if (newVal == '')
array.push ({type: "emptytext", depth: depth});
else
array.push ({type: "text", node: node, display: "inline", depth: depth});
}
break;
}
};
出典
2011-03-27 23:18:55
rob
理由:
ここでは、コードのですか?どうして?どうして?どうして? –
だからこそ、真剣に、それは長い話ですが、出力を効率的に(最も重要なことに)フォーマットしていない状態に保ちながら、人々が最もフレンドリーでかわいらしいインデントされた方法でhtmlを編集できるようにしたいと思います。私が言ったように、良い理由があることを安心してください。 – rob
可能な複製http://stackoverflow.com/questions/1550532/trimming-whitespace-from-html-content? –