为什么我无法插入仅设置了零宽度空白的文本节点?

Why am I not able to insert text nodes which only have zero width whitespaces set?

我正在尝试使用 JS 插入空白文本节点,但它根本不起作用。 innerHtml 属性 是否因 TextNode 而被忽略?

看我的JSFiddle

insertWhitespace = function() {

  var contentEditable = document.getElementById("txt");
  var element = document.getElementById("annyoing-html");

  var textNodeLeft = document.createTextNode("");
  var textNodeRight = document.createTextNode("");

  textNodeLeft.innerHtml = "​";  
  textNodeRight.innerHtml = "​";

  contentEditable.insertBefore(textNodeLeft, element);

  if(element.nextSibling != null) {     
    contentEditable.insertBefore(textNodeRight, element.nextSibling);  
  } else {
    element.appendChild(textNodeRight);
  }
};

我实际上打算插入零个空白字符,但无论如何它都无法正常工作。

如何插入这样的文本节点?

是的,文本节点没有 .innerHTML 属性。只有 HTMLElements 可以。 所以,这将起作用:

var textNodeLeft = document.createElement("span");
textNodeLeft.innerHTML = "    ";

HTML 实体(&entity; 格式的字符串)令人震惊地用于 HTML.

对于 JavaScript,您需要使用 JavaScript 转义序列。

在这种情况下,不间断space,即\xA0

但是,将 NBSP 链接在一起以人为创建 space 是非常 不好的做法。您应该使用边距、填充、定位...任何东西,只要它是 CSS。间距是表示的一部分,而表示是 CSS 的工作。

为了完整起见,您可以使用正常的 spaces (" "),前提是您将容器的 CSS 设置为包含 white-space: pre-wrap 以使白色 space 意义重大。

如前所述,  是一个 HTML 实体。您正在尝试填充 text 节点,而不是 HTML.

因此,要将一个"non-breaking whitespace"( )填充到一个文本节点中,可以使用它的unicode字符编码:

var textNode = document.createTextNode("\xA0");
// or
var textNode2 = document.createTextNode("");
textNode2.data = "\xA0";   // or
textNode2.textContent = "\xA0";

文本节点没有 .innerHTML 属性(注意:注意大小写)

最简单的解决方案是在创建元素时将正确的内容指定为 Unicode 文字:

var textNodeLeft = document.createTextNode("\u200b");
var textNodeRight = document.createTextNode("\u200b");