设置 innerHTML 会吃掉内部表单元素。从什么时候开始,通过什么浏览器?

Setting innerHTML eats inner form element. Since when and by what browsers?

提问人:codetuner 提问时间:11/9/2023 更新时间:11/10/2023 访问量:47

问:

如果以下代码按我的预期运行,按下按钮会将 FORM 的内部 P 元素替换为另一个 FORM,并且会出现嵌套边框:

<form id="aa1" style="border: solid 2px blue; padding: 4px;">
    <p>Original content</p>
</form>

<button type="button"
 onclick="document.getElementById('aa1').innerHTML = '<form id=\'aa2\' style=\'border: solid 8px red; padding: 4px;\'><p>New content</p></form>';">
 Click me
</button>

在 Chrome 119 和 Edge 118(在 Windows 上)中,情况并非如此:内部表单被剥离,原始段落被内部表单的内容替换。

我知道,HTML 中不允许嵌套表单。

我的问题是:所有浏览器的行为都是这样的吗?这种行为在某处描述过吗?从什么版本开始,浏览器的行为是这样的?

在 Fiddle 上试试:https://jsfiddle.net/rnk9vms5/3/

HTML Google-Chrome 浏览器 Microsoft-Edge Chromium

评论

1赞 Dai 11/9/2023
我有一个运行 WS 2012 R2 的 VM,IE11 仍在工作,IE11 也取代了整个 : imgur.com/a/CpdegPx - 所以这当然不是新行为(因为 IE11 于 2013 年 10 月问世,10 年前)<form>
0赞 epascarello 11/10/2023
当您拥有无效的 HTML 时,浏览器会尝试找出一种方法来使其工作。浏览器如何修复代码中的错误取决于浏览器。
0赞 codetuner 11/10/2023
@epascarello:因此我的问题是:哪些浏览器以什么方式运行?这真的是由浏览器自行决定的,还是这种“纠正”行为被记录和版本化?

答:

3赞 Marco Bonelli 11/10/2023 #1

现代浏览器非常宽松,接受无效的 HTML,无论如何都试图呈现它,并假设程序员可能想要什么。这并不意味着您应该依赖此类行为或故意编写无效的 HTML。

所有浏览器的行为都是这样的吗?

是的,现在都是。

这种行为在某处描述过吗?从什么版本开始,浏览器的行为是这样的?

没有。它是特定于实现的,并且会因浏览器而异,也可能因同一浏览器的版本而异。你不应该依赖它。


例如,包含以下无效 HTML 代码的网页:

<a>Hello

将被大多数现代浏览器转换为:

<html>
    <head></head>
    <body>
        <a>Hello</a>
    </body>
</html>

评论

0赞 codetuner 11/10/2023
“那为什么要尝试创建无效的 HTML 呢?” > 您应该记住,在我的问题中,我表达了一种特定的情况,但我的代码可能更通用。我不是要嵌套HTML表单。我正在尝试替换innerHTML。这是通用功能,我无法控制谁将使用它做什么......
0赞 Marco Bonelli 11/10/2023
@codetuner更新了我的答案
0赞 codetuner 11/10/2023
感谢您的更新。我现在投了赞成票,因为它现在回答了我的问题。但是请注意,不关闭 P 标签并不是在所有 HTML 版本上都无效的:它不在原始 HTML 规范中(参见 shorturl.at/EHLRV 上的注释 1i),并且似乎仍然不是绝对需要的(参见 shorturl.at/uAJVW 中的标签省略)。其余的,你是对的,浏览器很宽松。这里的区别在于,浏览器不仅在渲染嵌套表单方面很宽松,而且可以有效地操纵注入的 HTML 以删除其中的某些部分。感谢您的回答和您的时间!
1赞 Marco Bonelli 11/10/2023
@codetuner “这里的区别在于,浏览器不仅在呈现嵌套表单方面很宽松,而且可以有效地操纵注入的 HTML 以删除其中的一部分。” - 是的,没错!有时,这也可能以非常令人惊讶的方式发生。例如,在安全方面,攻击者故意注入格式错误的 HTML 以绕过 XSS 过滤器,然后浏览器试图“修复”某些东西。这很有趣。例如,请参阅此页面。P.S. 编辑为 .<p><a>