【问题标题】:.innerHTML loses HTML Syntax formatting.innerHTML 丢失 HTML 语法格式
【发布时间】:2019-12-29 00:57:09
【问题描述】:

我刚刚注意到浏览器忽略了HTML格式(比如对齐这个sn-p中的两个属性):

 <div id="container">
      <div id="contained"
           other-prop="some value">
      </div>
 </div>

如果你跑了

var container = document.getElementById('container');
console.log(container.innerHTML);

你得到输出

<div id="contained" other-prop="some value">
</div>

在源代码中如何编写或直接在 JavaScript 中设置 .innerHTML 都没有关系。

是否可以像用户用JS写的一样查询一个元素对应的页面源?有空白和一切。当用户使用 DOM 操作修改元素时,我可以看到存在问题,在这种情况下,我仍然会很高兴

  1. 保留原始用户格式以用于未修改的所有内容,或
  2. 可以在用户在页面加载时编写原始源代码,而无需修改 DOM

一个 sn-p,以便您可以看到它的实际效果:

var container = document.getElementById('container');
console.log(container.innerHTML);

container.innerHTML = `  
  <div id="contained"
       other-prop="some value">
  </div>
`;

console.log(container.innerHTML);

container.children[0].setAttribute('modification', '');

console.log(container.innerHTML);
<div id="container">
  <div id="contained"
       other-prop="some value">
  </div>
</div>

【问题讨论】:

  • 无法读取浏览器用来组成页面的流。
  • @TravisJ 有什么参考资料吗? (在文档的某处提到/另一个 SO 线程...?)
  • 在应用程序级别读取流。对此没有“文档”,因为它本质上是常识,就像没有文档说明 JavaScript 无法从网页访问注册表一样。访问流将退出沙箱,并且本质上意味着您已经获得了对指令执行的操作系统级别的访问权限,因为这是应用程序执行的位置。
  • @TravisJ 得到了你。是不是浏览器也不会通过一些API暴露流的内容?
  • @PeeyushKushwaha 浏览器不会在任何 API 中暴露页面的原始数据。我知道的唯一方法是使用 fetch 请求查询页面的文本内容,然后使用 RegEx 或 indexOf() 在该文本中查找元素,正如我在回答中总结的那样。跨度>

标签: javascript dom html-parsing


【解决方案1】:

这根本不可能。 将代码视为计算机之间的消息,用于表达视觉表示,其中空格并不重要。

【讨论】:

    【解决方案2】:

    使用传统方法,不,这是不可能的。 HTML 在呈现页面时总是会丢弃多余的空白,不幸的是,没有办法禁用此功能。

    简而言之,当您编写 HTML 代码时,您向浏览器提供了 what 呈现的指令,而不是 如何 呈现它的指令。当您加载页面时,浏览器会解释这些指令并输出它认为您想要的渲染。

    当您使用innerHTML 时,您请求浏览器将该呈现的内容转换回 HTML 指令。它几乎完美地做到了这一点,但它不能也不会放回它删除的空白;由于该信息不会影响页面的外观,因此浏览器在呈现时会忽略它。

    如果您愿意放弃所有最佳实践,理论上您可以使用Fetch 请求向服务器查询您所在页面的 HTML 内容,然后将响应解析为纯文本。

    但是,这对于您的特定用例来说是有问题的,因为如果您想从此文本中检索特定元素,您没有任何 DOM 方法或实用程序可供您使用。如果您尝试使用DOMParser 或类似的东西来解析纯文本,文本将再次开始像 HTML 一样,并丢弃多余的空格。

    如果您仍然真的想这样做,最好的选择是使用 RegEx 或 .indexOf() 在明文响应的中间找到您要查找的元素。不过,我真的想强调一下,这是非常糟糕的做法,不应该用于研究之外的任何事情。

    还需要注意的是,如果您尝试处理的页面是客户端生成的 SPA(单页应用程序),那么此解决方案将不起作用。如果您正在处理客户端 SPA(例如,React、Angular、Vue 等),您可以对渲染脚本进行逆向工程以找到包含空格的元素的定义。然而,除此之外,你很可能不走运。

    【讨论】:

    • 我同意解析器不需要空格信息。尽管如此,问题仍然是如何获取这些信息。我disagree that the best way to parse it myself would be using RegEx
    • @PeeyushKushwaha 我喜欢这篇文章,并且我原则上同意如果您尝试解析整个页面,有更好的方法可以做到这一点。 但是,对于您的用例,它要求您找到具有可变数量空白的任意元素,它要么是 indexOf(),要么基本上什么都没有。除了检索 HTML 文件的全文内容并以某种方式在文本中找到您要查找的元素之外,别无他法。使用 DOMParser 将其转换为 DOM 表示将删除空格,因此您唯一的选择是处理字符串内容。
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2014-06-06
    • 2015-01-15
    • 2021-01-03
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多