Javascript在不应该删除空格的情况下删除了空格?

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等类似的项目,但是我没有成功。

10个回答

10

HTML是不敏感空格的,这意味着您的DOM也是如此。将您的“Hello World”包装在

块中会起作用吗?


实际情况是使用数据网格,我不认为我能让它这样做。但你对DOM规则的理解是100%正确的。我只是希望有一种类似的hack方法。 - Mitchel Sellers

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

3

小提示:innerText只在Internet Explorer浏览器中有效,而innerHTML在所有浏览器中都有效...因此,请使用innerHTML而不是innerText。


谢谢你的建议!我们现在使用IE6,而且还会用一段时间,但这很有用。无论如何,我得重写代码,这已经足以让管理层认识到代码是不安全的了!我讨厌遗留代码... - Mitchel Sellers
这种情况不再存在了--我建议检查哪个存在并使用存在的那一个。 - slifty

3

pre标签或CSS中的white-space: pre会将所有空格视为有意义的。然而,这也会将换行符转换为换行符,因此请注意。


1
这里只是个人意见,不是官方建议。如果你试图通过Javascript从DOM中提取精确文本值,使用inner/outer HTML/TEXT属性,那么你将会遇到麻烦。不同的浏览器将会返回略微不同的值,这取决于浏览器如何“看待”内部文档。
如果可以的话,我建议更改你正在渲染的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 控件。浏览文档(哈)或者提出稍微不同的问题,看看该控件是否提供了官方客户端 API,这也许值得一试。


哦,我知道这很糟糕,我只是想看看是否有一种快速的黑客方法来解决它。该控件是一个旧的ASP.NET 1.1控件,甚至开发者已不再支持它。我继承了整个遗留代码,这是垃圾...我将以正确的方式重新编写它... - Mitchel Sellers

0
如果有人能正确格式化我的上一篇帖子,它看起来会更易读。抱歉,我弄糊涂了。基本上诀窍是创建一个临时的pre元素,然后将你的节点复制到其中。然后你可以根据浏览器获取innerText或者textContent。
除IE浏览器外,所有浏览器基本都能正确地做出明显的事情。因为IE只在pre元素中保留空格,而且仅在您访问innerText时才保留。

0

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


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;

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

当我准备写答案时,我也曾这样想过。但在IE 7中仍然会去除空格。 - Rontologist
nodeValue仍然比innerHTML更好,因为它将<视为一个字符而不是4个字符(<)。 - Leo

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>

一些注意事项:

  • 必须有文档类型声明。
  • 在 window.onload 触发之前,不能查询 DOM 元素。
  • 应该使用 element.nodeValue 而不是 innerHTML 等来避免当文本包含像 < > & 这样的内容时出现错误。
  • 由于我认为是一个丑陋的 bug,IE 渲染页面后无法重置 whiteSpace。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接