八、框架
1. 我的页面在框架里吗?(Is my page framed?)
Q:我的页面是框架中的页面呢,还是浏览器的顶层窗口呢?
A:要测试页面是否在框架中,可以使用下面的条件操作符:
if (self.location!=top.location) // if yes, you're framed if (self.location==top.location) // here you aren't framed
示例。我们假设你的网站使用框架提供了一些功能导航(就像这个网站一样www.javascripter.net/faq)。假设你的顶层框架集(frameset)在文件/index.hm中。如果一个用户访问了一些没有在框架的页面,应该如何处理呢?(这种情况可能发生,如用户使用搜索。)对于这类用户,你可能希望显示一个到顶层框架集的超链接——只在页面不在框架中时显示。
if (self.location==top.location) { // The page is not in the frameset index.htm !!! document.write('<p><a href="/index.htm">Home page</a>') }
该页上就使用了类似的代码。如果你在顶层窗口中打开该页,你就会看到一个额外的超链接内容目录(Table of Contents)(就在页面顶端,标题的正下方)。这个超链接会把你带回框架视图。
2. 跳出框架(Breaking out of a frameset)
Q:一些不怀好意的家伙会从别的网站把我的页面加载到他们的框架。我如何才能跳出这些框架呢?
A:你只需要测试你的页面是否在框架中,就像上一个问题提到的。如果是,你可以很容易跳出框架:
if (self.location!=top.location) top.location=self.location;
不过,要保守使用这个小技巧——特别是你自己的网站也使用框架时!
译者注:
关于这个问题,可以分为两种情况:
1. 对于独立页面,可以采用上面的方法
2. 如果页面也在框架中,可以判断所在框架的名称是否和预设的相同:
if(window.name != "dd") top.location=self.location;
3. 同时更新两个框架(Updating tow frames at a time?)
Q:我是否可以同时更新两个(或更多)框架?
A:可以。同时更新几个框架最简单的方法就是使用JavaScript函数,向即将被更新的框架中加载新页面。例如,如果你有两个框架,left和right,那么同时更新这两个框架的函数就是:
function updateBothFrames() {
top.left.location="newpage1.htm";
top.right.location="newpage2.htm";
}
这个函数可以在用户按下一个按钮或者点击一个超链接时调用。下面的例子给出了创建调用这个函数的按钮和超链接的HTML代码:
<a href="javascript:updateBothFrames()">Click here</a>
<input type=button value="Press me" onClick="updateBothFrames()">