为什么“自我”是什么?

时间:2010-09-04 19:54:38

标签: javascript

我有一个框架页....

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" 
"http://www.w3.org/TR/html4/frameset.dtd">

<html>
  <head>
     <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
     <title>Main title</title>
    <script type="text/javascript" src="JS.js"></script>
  </head>
  <frameset rows="10%,90%" id="frameid" name="frameName">
     <frame src="FrameA.htm"     name="F_A">
     <frame src="FrameB.htm"     name="F_B">
  </frameset>
</html>

这是FrameA.htm; FrameB看起来类似

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
     <script type="text/javascript" src="JS.js"></script>
     <title>Frame A Title</title>
   </head>

   <body onload="parent.ldfunc()" class="Resize" id="idA">
      Body of frame A 
  </body>
</html>

最后是一个javascript JS.js

function ldfunc () {
  alert("window.self.name: " + window.self.name);
  alert("window.self.document.body.id: " + window.self.document.body.id);
}

现在,这就是摩擦......

1)如果body标签中的onload子句是上面的parent.ldfunc(),则'self'似乎是框架页面,而不是页面A或页面B. ID显示为frameid。

2)如果onload子句是ldfunc()而没有父项,则“self”指向页面A或页面B按预期方式。即id显示为idA或iadB。

换句话说,自我似乎遵循功能位置,而不是页面。

为什么我试试这个?我将有几千页将被A加载到B中,我认为我可以省去将脚本放在每个标题中的必要性。

有没有办法让框架页面加载脚本全局并可供其他页面使用?

1 个答案:

答案 0 :(得分:2)

该函数中的

窗口未动态引用。对窗口的引用是在声明函数时创建的,因此始终是函数所在位置的窗口引用。当你在声明时基本上将外部引用嵌入到函数中时,这称为闭包。

调用函数时,需要将上下文窗口作为参数传递。

将脚本放在顶部框架/窗口中。 使用以下函数调用函数:

top.funcName();

传递上下文。

top.funcName(window);