关于HTML框架集的一些问题

时间:2010-08-11 10:27:58

标签: javascript

今天我试图通过创建几个页面来研究框架集,这就是网站的工作原理,框架集定义页面被分成两个独立的子框架,而这两个页面内部包含一个 textarea 按钮,当用户点击按钮时,将打印出访问 textarea 的页面,页面如下:

框架集定义页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<title>Example</title>

<head>

<script type="text/javascript">

var siteList = new Array();

function returnPageVisited_onclick()
{
 var returnValue = "The pages you've visited : " + "\n"

 for(var i = 0 ; i < siteList.length ; i++)
 {
  returnValue += siteList[i] + "\n";
 }
 window.document.myForm.pageVisited.value = returnValue;
}

function printSiteLs_onload(fileNameStart)
{
 var pageName = fileNameStart.lastIndexOf("/") + 1;

 siteList[siteList.length] = fileNameStart.substr(pageName);
}

</script>


</head>



<frameset cols="50% , *">

 <frame src="pageA.html" name="fraLeft" />
 <frame src="pageB.html" name="fraRight" />

</frameset>


</html>
框架页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<title>Example</title>

<head>
</head>

<body onload="window.parent.printSiteLs_onload(window.location.href);">

<h2> This is Page A </h2>

<p>

<a href="pageA.html">Page A</a>
<a href="pageB.html">Page B</a>
<a href="pageC.html">Page C</a>
<a href="pageD.html">Page D</a>

</p>

<form name="myForm">

<textarea name="pageVisited" rows="10" cols="35">
</textarea>

<input type="button" name="myBtn" value="Click To Check"    onclick="window.parent.returnPageVisited_onclick()"/>

<br />

</form>

</body>

</head>

</html>

还有另外3个页面的编码与上面的框架页面相同,只是行<p> This is page A</p>不同,我的问题是框架集定义页面中的代码行,即{{1}对于第一个函数,firebug给了我一个错误“window.document.myForm is undefined”,这是我的想法,我正在使用frameset创建一个模块来存储泛型函数,这样其他页面可以访问其中的函数,但我想知道为什么我得到这个错误,因为函数没有在主页中调用,而是在定义了myForm的框架页面中调用,所以为什么我仍然会遇到这种错误非常感谢,如果有人可以纠正我的陈述,如果我错了,谢谢你

1 个答案:

答案 0 :(得分:1)

问题是,即使你从框架页面调用'returnPageVisited_onclick()',当它运行时,它也会在框架集定义页面的范围内这样做。在这些情况下,“窗口”指的是框架集定义窗口,而不是框架窗口。

要解决此问题,您需要做的是将表单引用传递给函数。

onclick="window.parent.returnPageVisited_onclick(this.form)"

...然后直接使用该引用...

function returnPageVisited_onclick(targetForm)  
{  
   var returnValue = "The pages you've visited : " + "\n"  

   for(var i = 0 ; i < siteList.length ; i++)  
   {  
     returnValue += siteList[i] + "\n";  
   }  
   targetForm.pageVisited.value = returnValue;  
}  

这有意义吗?

更新:

看起来需要进一步解释......

这一切都围绕着一个叫做上下文的东西,这是一个可以访问所有东西的参考点。

为了给出大量简化的解释,假设您有2台PC,每台PC都打开相同的网页。运行一段引用变量“x”的代码。您不希望机器A上的代码从机器'B'访问'x'变量,反之亦然。这是因为存在隐含的上下文,并且该上下文是运行代码的机器。

要将此概念应用于您的示例,当您引用“窗口”时,您所暗示的是“当前窗口” - 即代码所在的窗口。因此,当您的框架托管页面显示...

window.parent

...它明确地提供了一个上下文,它等同于框架集定义页面的窗口对象。当此上下文应用于'returnPageVisited_onclick'调用时,对'window.document.myForm'的任何引用都在该页面中,而不是在框架托管页面中。然后失败,因为框架集定义页面中没有任何形式。

这就是我建议您将参数传递给函数的原因,因为此参数提供了一个上下文,您可以从中引用该表单。