今天我试图通过创建几个页面来研究框架集,这就是网站的工作原理,框架集定义页面被分成两个独立的子框架,而这两个页面内部包含一个 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的框架页面中调用,所以为什么我仍然会遇到这种错误非常感谢,如果有人可以纠正我的陈述,如果我错了,谢谢你
答案 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'的任何引用都在该页面中,而不是在框架托管页面中。然后失败,因为框架集定义页面中没有任何形式。
这就是我建议您将参数传递给函数的原因,因为此参数提供了一个上下文,您可以从中引用该表单。