通常,我们将JavaScript <script>标记放在HTML文档的底部,紧接在</body>标记之前,这样做的好处是在DOM and some more things中所有元素都可用之后才执行它们。

但是,我使用的frame document 1确实具有<frameset>而不是<body>标记。我不想将它们放在文档的<head>中,因为它们将无法立即访问下面的DOM元素。而且我也不想在标准正文标签中使用<iframe> 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>

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

仅供引用,将它们放在</frameset> like it's sometimes done with <body> s之后也不起作用。

1:是的,我知道他们已弃用。它们只是我项目的自然选择2,它是一个并排的整齐 View ,其中显示了两个文档,并以一种复杂的方式将它们一起滚动。
2:…而且我以前从未使用过它们,所以我想尝试一下。
3:这就是我最后的想法,毕竟onload处理程序是微不足道的。问题仍然存在,我很好奇。
4:工作正常,但需要复杂的CSS样式

最佳答案

<script>元素只能出现在<head>元素或<body>元素中。它不能作为<frameset>元素的子元素出现; <frameset>只能包含<frame>元素,<noframes>元素或其他<frameset>元素。参见Transitional DTD:

<!ELEMENT FRAMESET - - ((FRAMESET|FRAME)+ & NOFRAMES?) -- window subdivision-->

通常,由于DTD只是规则手册,因此浏览器很乐意将元素插入不属于DTD的其他元素中,因为DTD只是一个规则手册,但这并不总是发生的(例如,您永远不能放置任何其他元素不管您如何努力,都会将元素流到HTMLParagraphElement中),因此,如果浏览器拒绝将HTMLScriptElement放置在HTMLFrameSetElement中,这就是原因。

任何解决方法都将在框架集的<script>元素中或其中一个框架内放置<head>元素。 (您也可以在<script>元素中放置<noframes>元素,因为<noframes>具有与<body>相同的内容模型,但是由于明显的原因,这不能解决您的问题。)

关于javascript - 如何在框架集文档的 "body"中放入<script>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36049988/

10-09 01:54