提问人:Peeyush Kushwaha 提问时间:8/24/2019 最后编辑:Peeyush Kushwaha 更新时间:8/26/2019 访问量:1172
.innerHTML 丢失 HTML 语法格式
.innerHTML loses HTML Syntax formatting
问:
我刚刚注意到浏览器忽略了 HTML 格式(例如对齐此代码片段中的两个属性):
<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 操作修改元素时,我可以看到存在问题,在这种情况下,如果
- 原始用户格式将保留所有内容,不受修改的影响,或者
- 可以在用户在页面加载时编写原始源代码,而无需修改 DOM
一个片段,以便您可以看到它的实际效果:
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>
答:
这根本不可能。 将代码视为计算机之间的消息,以表达视觉表示,其中空格并不重要。
使用常规方法,不,这是不可能的。HTML 在呈现页面时总是会丢弃多余的空格,不幸的是,无法禁用此功能。
简而言之,当你编写 HTML 代码时,你给浏览器提供了渲染什么的指令,而不是如何渲染它。当您加载页面时,浏览器会解释这些指令并输出它认为您想要的内容的呈现。
当您使用 时,您请求浏览器将呈现的内容转换回 HTML 指令。它几乎完美地做到了这一点,但它不能也不会放回它删除的空格;由于该信息不会影响页面的外观,因此浏览器在呈现时会忽略它。innerHTML
如果您愿意将所有最佳实践都抛到窗外,理论上可以使用 Fetch
请求向服务器查询您所在页面的 HTML 内容,然后将响应解析为纯文本。
但是,这对于您的特定用例是有问题的,因为如果您想从本文中检索特定元素,则没有任何 DOM 方法或实用程序可供使用。如果您尝试使用 DOMParser
或类似的东西解析明文,文本将再次开始像 HTML 一样工作并丢弃多余的空格。
如果你仍然真的想这样做,你最好的办法是使用正则表达式或在明文响应中间找到你要找的元素。不过,我真的想强调,这是非常糟糕的做法,不应该用于研究以外的任何事情。.indexOf()
同样重要的是要注意,如果您尝试处理的页面是客户端生成的 SPA(单页应用程序),则此解决方案将不起作用。如果你正在处理客户端 SPA(例如,React、Angular、Vue 等),你可以对渲染脚本进行逆向工程,以找到包含空格的元素的定义。然而,除此之外,你可能不走运。
评论
indexOf()
评论
fetch
indexOf()