如何将<script>放在框架集文档的"正文"中?

Ber*_*rgi 5 html javascript frames frameset script-tag

通常我们将JavaScript <script>标记放在HTML文档的底部,就在结束</body>标记之前,这样做的好处是它们在DOM中已经可用的所有元素之后执行,还有更多的东西.

但是,我使用的是框架文档 1,<frameset>而不是<body>标签.我不想把它们放在<head>文档中,因为它们不能立即访问3以下的DOM元素.而且我不想<iframe>在标准身体标签中使用s 4.我试过了

<head>
  <title>Framesets are interesting</title>
</head>
<frameset cols="50%,50%">
  <frame id="frame-a" src="a.html">
  <frame id="frame-b" src="b.html">
  <script type="text/javascript">
    console.log("hello world!");
    console.log(document.getElementById("frame-a")); // this is what I'm after
  </script>
</frameset>
Run Code Online (Sandbox Code Playgroud)

但是,脚本根本没有执行,甚至没有出现在DOM检查器中.当然,一个<frameset>可能只包含<frame><noframes>标签.但是,<frame>标签之后真的没有办法让脚本执行吗?

仅供参考,将它们放置在</frameset> 有时用<body>s 完成后也不起作用.

1:是的,我知道他们已被弃用了.它们只是我项目的自然选择2,一个简洁的并排视图,显示两个文档并以复杂的方式将它们滚动在一起.
2:......之前我从未使用过它们,所以我想尝试一下.
3:这就是我最终的结果,毕竟一个onload处理程序是微不足道的.问题仍然存在,我很好奇.
4:工作正常,但需要复杂的CSS样式

Bol*_*ock 5

<script>元件仅可以出现在任何一个<head>元件或<body>元件.它不能作为<frameset>元素的子元素出现; a <frameset>只能包含<frame>元素,<noframes>元素或其他<frameset>元素.查看Transitional DTD:

<!ELEMENT FRAMESET - - ((FRAMESET|FRAME)+ & NOFRAMES?) -- window subdivision-->
Run Code Online (Sandbox Code Playgroud)

通常情况下,浏览器很乐意将元素插入其他不完全无视DTD所说的元素,因为DTD只是一个规则手册,但这并不总是发生(例如,你永远不能放任何其他元素)无论你怎么努力,都将 flow元素转换为HTMLParagraphElement ,因此如果浏览器拒绝在HTMLFrameSetElement中放置HTMLScriptElement,那么这就是原因.

任何变通方法都涉及将一个<script>元素放在框架集的<head>元素中,或者放在其中一个框架中.(您也可以在<script>元素中放置<noframes>元素,因为它<noframes>具有相同的内容模型<body>,但由于显而易见的原因,这不会解决您的问题.)