7

次のようなコードを含む HTML ファイルがあります。

<table>
    <tr>
    <td id="MyCell">Hello  World</td>
    </tr>
</table>

次のようなJavaScriptを使用して値を取得しています

document.getElementById(cell2.Element.id).innerText

これは、hello と world の間にスペースが 1 つだけあるテキスト "Hello World" を返します。同じ数のスペースを保持する必要があります。それを行う方法はありますか?

innerHTML、outerHTML、および同様のアイテムを使用してみましたが、うまくいきません。

4

10 に答える 10

10

HTML は空白を区別しないため、DOM も同様です。「Hello World」をプレブロックでラップすることはできますか?

于 2008-10-17T21:05:31.170 に答える
8

HTML では、テキストの表示と DOM 経由の取得の両方で、1 より大きいスペースは無視されます。スペースを維持する唯一の保証された方法は、改行しないスペースを使用すること&nbsp;です。

于 2008-10-17T21:07:08.687 に答える
3

ヒントとして、innerText は Internet Explorer でのみ機能しますが、innerHTML はすべてのブラウザーで機能します。そのため、innerText の代わりに innerHTML を使用してください。

于 2008-10-17T21:09:46.717 に答える
2

preタグまたはCSS では、white-space: preすべてのスペースが意味のあるものとして扱われます。ただし、これも改行を改行に変えるため、注意してください。

于 2008-10-17T21:40:58.870 に答える
0

編集:私は間違っています、私を無視してください。

空白を正しく表すテキスト ノードの nodeValue を取得できます。

これは、特定の要素内のテキストを再帰的に取得する関数です (これはライブラリセーフであり、Array.prototype などを変更するものを使用しても失敗しません):

var textValue = function(element) {
    if(!element.hasOwnProperty('childNodes')) {
        return '';
    }
    var childNodes = element.childNodes, text = '', childNode;
    for(var i in childNodes) {
        if(childNodes.hasOwnProperty(i)) {
            childNode = childNodes[i];
            if(childNode.nodeType == 3) {
                text += childNode.nodeValue;
            } else {
                text += textValue(childNode);
            }
        }
    }
    return text;
};
于 2008-10-17T21:42:32.063 に答える
0

確認したところ、preタグでラップする必要があるようです。

于 2008-10-17T21:07:44.520 に答える
0

この次のトリックは、IE の innerText に空白を保持します。

var cloned = element.cloneNode(true);
var pre = document.createElement("pre");
pre.appendChild(cloned);
var textContent = pre.textContent
  ? pre.textContent
  : pre.innerText;
delete pre;
delete cloned;
于 2009-01-13T21:57:18.850 に答える
0

誰かが私の最後の投稿を正しくフォーマットできれば、もっと読みやすくなるでしょう。すみません、私はそれを台無しにしました。基本的には、使い捨ての pre 要素を作成してから、ノードのコピーをそれに追加します。次に、ブラウザに応じて innerText または textContent を取得できます。

IE を除くすべてのブラウザは、基本的に明らかなことを正しく行います。IE は、pre 要素の空白のみを保持し、innerText にアクセスする場合にのみ保持するため、このハックが必要です。

于 2009-01-13T22:00:23.307 に答える
0

ここでは単なる意見であり、標準的なアドバイスではありませんが、Javascript を介して内側/外側の HTML/TEXT プロパティを使用して DOM から正確なテキスト値を抽出しようとすると、世界に向かっているか、傷ついています。ブラウザが内部ドキュメントをどのように「見る」かに基づいて、ブラウザが異なれば、わずかに異なる値が返されます。

可能であれば、レンダリングしている HTML を変更して、次のような非表示の入力を含めます。

<table>
    <tr>
    <td id="MyCell">Hello  World<input id="MyCell_VALUE" type="hidden" value="Hello  World" /></td>
    </tr>
</table>

そして、次のようなJavaScriptで値を取得します

document.getElementById(cell2.Element.id+'_VALUE').value

入力タグは値を保持するように設計されているため、忠実度の問題が発生する可能性は低くなります。

また、何らかの .NET コントロールを使用しているようです。ドキュメント (ha) に目を通すか、少し異なる質問をして、コントロールが何らかの公式のクライアント側 API を提供しているかどうかを確認する価値があるかもしれません。

于 2008-10-18T18:45:45.240 に答える
0

これは少しハックですが、私の IE では動作します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
    <title></title>
</head>
<body>
<div id="a">a  b</div>
<script>
var a = document.getElementById("a");
a.style.whiteSpace = "pre"
window.onload = function() {
    alert(a.firstChild.nodeValue.length) // should show 4
}
</script>
</body>
</html>

いくつかのメモ:

  • Doctype が必要です。
  • window.onload が起動する前に DOM 要素をクエリすることはできません
  • テキストに < > や "
  • IE がページのレンダリングを終了すると、whiteSpace をリセットできません。これは、醜いバグであると想定しています。
于 2008-10-18T19:17:00.823 に答える