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

时间:2016-03-17 01:17:48

标签: javascript html frames frameset script-tag

通常我们将JavaScript &lt; script&gt; 标记放在HTML文档的底部,就在结束&lt; / body&gt; 标记之前,其好处是它们在DOM 以及更多内容中已经可用的所有元素之后执行。

&#xA; &#xA;

然而,我正在使用框架文档 1 ,它有&lt; frameset&gt; 而不是&lt; body&gt; 标记。我不想将它们放在文档的&lt; head&gt; 中,因为它们不能立即访问 3 下面的DOM元素。我不想在标准正文标记 4 中使用&lt; iframe&gt; 。我已经尝试了

&#xA;&#xA;
 &lt; head&gt;&#xA; &lt; title&gt;框架集很有趣&lt; / title&gt;&#xA;&lt; / head&gt;&#xA;&lt; frameset cols =“50%,50%”&gt;&#xA; &lt; frame id =“frame -a”src =“a.html”&gt;&#xA; &lt; frame id =“frame-b”src =“b.html”&gt;&#xA; &lt; script type =“text / javascript”&gt;&#xA; console.log(“hello world!”);&#xA;的console.log(的document.getElementById( “帧-A”)); //这就是我追求的&#xA; &lt; / script&gt;&#xA;&lt; / frameset&gt;&#xA;  
&#xA;&#xA;

然而,脚本根本没有执行< / em>,它甚至没有出现在DOM检查器中。当然,&lt; frameset&gt; 只能包含&lt; frame&gt; &lt; noframes&gt; 标记。但是,是否真的无法在&lt; frame&gt; 标记后执行脚本?

&#xA;&#xA;

仅供参考引用,将它们放在&lt; / frameset&gt; 就像它有时使用&lt; body&gt; s 一样也不起作用。

&#xA;&#xA;

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

&#xA;

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

此处解决了类似的问题:Dynamically set frame src using javascript

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

答案 2 :(得分:1)

您可以通过插入带有数据URI的框架来放置脚本:

<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">
  <frame src="data:text/html,<script type='text/javascript'>with(parent) {
    console.log('hello world!');
    console.log(document.getElementById('frame-a'));
  }</script>">
</frameset>

当然,你需要小心引号,脚本将在另一个领域运行。您可以使用parenttop访问外部文档的window