7

我有一个 HTML 文件,其代码类似于以下内容。

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

我正在使用如下的javascript来获取值

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

这将返回文本“Hello World”,在 hello 和 world 之间只有 1 个空格。我必须保持相同数量的空间,有什么办法可以做到吗?

我试过使用 innerHTML、outerHTML 和类似的项目,但我没有运气。

4

10 回答 10

10

HTML 对空格不敏感,这意味着您的 DOM 也是如此。将您的“Hello World”包装在块中工作吗?

于 2008-10-17T21:05:31.170 回答
8

在 HTML 中,任何大于 1 的空格都会被忽略,无论是显示文本还是通过 DOM 检索文本。保持空格的唯一保证方法是使用不间断空格&nbsp;

于 2008-10-17T21:07:08.687 回答
3

提示一下,innerText 仅适用于 Internet Explorer,而 innerHTML 适用于所有浏览器……所以,请使用 innerHTML 而不是 innerText

于 2008-10-17T21:09:46.717 回答
2

您的 CSS 中的pre标签或标签white-space: pre会将所有空格视为有意义的。但是,这也会将换行符变成换行符,所以要小心。

于 2008-10-17T21:40:58.870 回答
0

刚刚检查了一下,看起来应该用pre标签包装。

于 2008-10-17T21:07:44.520 回答
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

这里只是一个意见,而不是规范的建议,但是如果您尝试通过 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

这有点hacky,但它适用于我的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>

一些注意事项:

  • 你必须有一个文档类型。
  • 在 window.onload 触发之前,您无法查询 DOM 元素
  • 您应该使用 element.nodeValue 而不是 innerHTML 等,以避免当文本包含 < > & " 之类的内容时出现错误
  • 由于我认为这是一个丑陋的错误,一旦 IE 完成渲染页面,您就无法重置 whiteSpace
于 2008-10-18T19:17:00.823 回答
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 需要这种 hack,因为它只在 pre 元素中保留空白,并且只有当您访问 innerText 时。

于 2009-01-13T22:00:23.307 回答