【问题标题】:extra newline in innerText of BR followed by DIVBR 的 innerText 中的额外换行符后跟 DIV
【发布时间】:2023-04-01 14:44:01
【问题描述】:

如果我有一个包含子项的 DIV,包括一个 BR 后跟一个 DIV,则 innerText 值似乎有一个无关的换行符。此外,如果我随后设置div.innerText = div.innerText,额外的换行符会出现在之前没有出现的地方!

我正在使用 Chrome。其他浏览器我没试过。

这是错误还是功能?我肯定无法想象这是设计使然的任何原因。无论如何,有没有办法摆脱这种行为?

我试图避免这种行为的原因是我想将所有 DIV 子节点折叠到一个文本节点中,但不更改(或至少看起来不更改)div 中的实际文本内容.避免 DIV 中的 DIV 和 BR 元素不是一种选择。

到目前为止,我发现能够在不更改换行符的情况下将 innerText 重新分配回 div.innerText 的唯一方法是创建我自己的 getInnerText() 函数,该函数遍历节点树以查找所有 BR和 TEXT_NODE 节点,同时构建一个自定义的 innerText ,在该元素紧接在 BR 之前的情况下,一直跳过 DIV 元素的换行符。它有效,但感觉应该有一个更简单的解决方案。

示例 1

如预期的那样,以下示例最初显示以下内容。注意两行之间没有空格:

但是,如果我随后执行以下 javascript:

div.innerText = div.innerText;

它意外地插入了一个空白换行符!

window.setTimeout(function() {
  alert('Click ok to run\n  div.innerText = div.innerText\nwhich will unexpectedly insert an extra newline!');
  div.innerText = div.innerText;
}, 1500);
<div id=div>
  <span>abc</span>
  <br>
  <div>def</div>
</div>

示例 2

这是一个更复杂的示例,包括 2 个换行符(需要)的块,它更改为 3 个换行符(不需要)的块。以下是它的显示方式(正确):

在将 innerText 设置为自身后,它错误地更改为以下内容:

window.setTimeout(function() {
  alert('Click ok to run\n  div.innerText = div.innerText\nwhich will unexpectedly insert two extra newlines!');
  div.innerText = div.innerText;
}, 1500);
&lt;div id=div style="white-space:pre"&gt;&lt;span&gt;abc&lt;/span&gt;&lt;br&gt;&lt;div&gt;&lt;span&gt;   def&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div&gt;ghi&lt;/div.&lt;/div&gt;&lt;/div&gt;

【问题讨论】:

  • 您要保留任何换行符还是折叠成单行?
  • 我们有一个功能,Stack Snippets(图标在编辑器工具栏中看起来像&lt;&gt;),它提供了与 jsfiddle.net 非常相似的功能,并且更可取,因为它将代码放在 Stack 上溢出,因此人们不必去其他地方,有些人在阻止 jsfiddle 的公司防火墙后面,但不是 Stack Overflow。

标签: html dom newline innertext


【解决方案1】:

这似乎是设计使然。

您可以将多余的行折叠成一个换行符

function read(element) {
  return element.innerText.replace(/\n+\s*\n+/g, "\n")
}

或者将所有多余的空格折叠成一个空格

function read(element) {
  return element.innerText.replace(/\s+/g, " ")
}

【讨论】:

  • 是的,但是这些选项都无法实现目标,即在折叠节点之前和之后看起来好像没有任何变化
  • 然后迭代子节点并根据需要手动组合结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多