茵芙莎这个牌子怎么样:JavaScript教程 - 第三部分 window 和 frame 对象 - Powered by ymCMS v3.1.0 Alpha2

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 20:35:12
JavaScript教程 - 第三部分 window 和 frame 对象

  2003-09-03 16:36
来源:
[正文]

创建新的 window (窗口) 对象

你有时需要打开一个新的浏览器窗口,用来显示信息或广告,但是在这里我要提醒你一下,大部分人在浏览一个网站的时候,是不会注意弹处的新窗口里边写些什么,他们会很快地关掉窗口,只有少数的人会留意这些弹出的窗口。然而,这项技术还是很不错的。

【弹出窗口的小测试】

在这个 在线示例 中,我们给出一个小测试问题的列表,对应于每一个问题都一个显示答案的超链接,而这些超链接将会弹出一个小窗口来显示答案,看一看代码就清楚了。

实际上,每一个答案的超链接都调用了同一个函数 showAnswer(),通过传递的参数 url (此参数是答案所在的页面的地址 URL) 的不同,在弹出的小窗口中显示不同的页面;在这个函数中使用了 window.open() 方法来创建新的窗口:

function showAnswer(url) {
window.open(url, "answer", "height=100,width=100,directories=no," +
"location=no,menubar=no," +
"resizeable=no,status=no,toolbar=no");
return false;
}

open() 方法有三个参数:打开窗口中的页面地址 URL (包括路径和文件名),给新窗口取的一个英文名字,打开的窗口的一些属性设置 (如窗口的高度、宽度、是否显示滚动条、是否显示浏览器的菜单栏等等)。

新窗口的名字在某些时候可能会用到,在别的窗口中使用 TARGET="新窗口的名字" 使超链接所链接的页面在新窗口中显示,描述窗口特性的参数是一个包含关键字和关键字值的字符串,各个关键字之间使用英文逗号 (,) 隔开,使用这个参数的时候一定要小心,各个关键字、关键字值、逗号之间千万不要有空格。

注意:此例中的 “+” 好只是为了代码能够换行书写才加上的,其实它们只是连结字符串而已,没有别的,不使用 “+” 好一样是可以的。

窗口特性 (即是打开的浏览器的样子) 的关键字、关键字值可以参考下表:

  • 是否显示工具栏:toolbar[=yes|no]|[=1|0]
  • 是否显示地址栏:location[=yes|no]|[=1|0]
  • 是否显示前进、后退、刷新按钮:directories[=yes|no]|[=1|0]
  • 是否显示状态栏:status[=yes|no]|[=1|0]
  • 是否显示菜单栏:menubar[=yes|no]|[=1|0]
  • 是否显示滚动条:scrollbars[=yes|no]|[=1|0]
  • 用户是否可以改变窗口的大小:resizable[=yes|no]|[=1|0]
  • 是否在新窗口中保留浏览器的浏览历史纪录:copyhistory[=yes|no]|[=1|0]
  • 窗口的宽度 (单位为像素):width=pixels
  • 窗口的高度 (单位为像素):height=pixels

如果在字符串中给定了这些值的话,窗口就会按你定义的现实,否则将会使用默认的值,想要进一步了解这方面的信息请参考 Netscape‘s JavaScript Guide !

【给窗口指定页面】

当你使用上面的方法创建了一个新窗口之后,你还可以再次给这个窗口指定新的页面,这就要用到 open() 方法的返回值了,请看下边的代码:

myWin = window.open(url, "", "height=100,width=100");
...
myWin.location = "newpage.html";

上边的代码将打开的新窗口的页面重新指定为 newpage.html,这样窗口中就会显示页面 newpage.html了。同时,在打开的新窗口中,你也可以通过使用 window 对象的 opener 属性将窗口对象指向打开此窗口的母窗口,这样也就可以对母窗口的数据或函数进行操作了,例如下边的代码中就是将母窗口的页面重新指定为 newpage.html

window.opener.location = "newpage.html";

【关闭一个窗口】

再让我们看一下前边的 在线示例 中我们所打开的新窗口,你会窗口中没有菜单栏,那我们该如何将此窗口关掉呢?不用担心,我们可以使用 window 对象的 close() 方法来关闭打开的小窗口,那个 “关闭窗口!” 按钮中就是使用了此方法:



当你按下按钮后,就会触发 onClick 事件,从而调用 window 对象的 close() 方法,此方法将当前的窗口关闭掉。

处理 frame [帧] 对象

正如我们在前边的章节中提到的那样,frame 帧其实是单独的窗口,它对应于单独的窗口对象,有自己的 locationhistorydocument 属性。

在这个 在线示例 中你将会看到一系列的帧,代码如下:












至于帧的结构、帧是如何分布的等等问题这里就不多讲了,我们希望你能查看一下例子中的源代码,你会发现帧 A 中有一个名为 setFrameColor() 的函数,它的作用是用来改变帧 B、帧 C、帧 D 的背景色,参数 fname 为目标帧的名字,参数 color 为目的背景颜色:

function setFrameColor(fname, color) {

window.parent.frames[fname].document.bgColor = color;
return false;
}

正如前边例中所演示的那样,BCD 帧的背景颜色确确实实被 document.bgColor 改变了,这里头最重要的是对帧对象的指定,这也是 window.parent.frames[fname] 的作用了,如果参数 fname 的值为 B,则改变帧 B 的颜色。

我们通过当前帧 (帧 A) 的 window.parent 属性指定到顶部的帧 (frameset,此帧包含了ABCD四个帧) ,然后通过顶部帧的 frames 数组加上帧的名字 fname 指定目标帧 (帧 BCD),最后通过目标帧的 document.bgColor 属性改变该帧的背景色。

下图很直观地显示了我们上边所讲的帧对象的指定关系:


图 3.1

【引用别的帧/窗口的变量和函数】

你不只是可以引用别的帧/窗口的 documentwindow 对象,而且还可以访问使用别的帧/窗口的变量和函数。

现在我们将上边的例子修改一下,请看 在线示例 。在新的例子中,我们给下边的三个帧都加了一个按钮,用来恢复各个帧的默认背景色,按下这些按钮后,将会调用帧 A 中的函数 setFrameColor()。下边就是调用帧 A setFrameColor() 函数的代码:

window.parent.frames["A"].setFrameColor(window.name, "#ffffff");

正如你所看到的,我们使用了与前边一样的技巧。首先使用 window.parent 指向顶层的帧 (frameset),然后使用 frames["A"] 指向帧 A,然后在后边加上帧 A 中的函数 setFrameColor(),并且加上两个参数,这样就可以运行帧 A 中的函数了。

需要注意的是函数 setFrameColor() 中使用的类似 window.name 的语句,这个名字和 frames[] 数组中使用的是相同的名字,同时这个名字还是 标记中通过 NAME="帧的英文名" 设置的名字。

下边是与帧相关的第二个例子的关系图:


图 3.2

类似地,你也可以使用相同的方法使用别的窗口/帧里边的全局变量,只需要将上边例中的函数名改成全局变量名即可。

window 对象的 locationhistory 属性

window对象的 location 属性包含了当前页面的地址 (URL) 信息,你可以直接改变此属性值,将其设置成新的地址 (URL):

window.location = "http://www.yahoo.com";
或者
location = "http://www.yahoo.com";

你还可以通过下边的两种方法中的任何一种来使浏览器从服务器上下载 (Load) 页面:

  • reload() - 促使浏览器重新下载当前的页面,也就是“刷新”当前页面了。
  • replace(URL) - 促使浏览器根据 URL 参数中给出的地址 (URL) 下载页面,同时在当前浏览器存储的历史记录 (即所浏览过的页面的列表) 中使用新的地址(即此方法中的 URL 参数) 覆盖当前的页面。

使用 replace() 方法意味着用户将不能通过按 “返回” 按钮回到前边浏览过的那个页面,但这并不是说用户完全不能回到原来的所有页面,他们只不过是无法回到被 replace() 方法替换的那一个页面 (注意:只是被替换的那一个页面)。

表面上看起来这种方法并不是很有用,而且好像还有点令人讨厌,但是,在一些特殊的情况下这种方法却是很有用的。看看这个 在线示例 就知道了,此例中使用 setTimeout() 方法每个三秒钟就下载一个新的页面,让程序运行一段时间,然后点击浏览器的 “后退” 按钮,你会看到浏览器的历史记录,好多好多,你再试着通过鼠标点击回到开始的页面,怎么样,回去了吗?好像比较麻烦,因为有一大堆的页面在那里挡着。

想要解决这个问题可以使用 replace() 方法,看一下这个改进后的 在线示例 就知道了,新的例子中,你只需点击一次 “后退” 按钮即可以回到最初的页面了。

【history 对象】

history 对象是一个很有用的对象,此对象记录着浏览器所浏览过的每一个页面,这些页面组成了一个历史记录列表。history 对象具有两种方法:

  • forward() - 将历史记录向前移动一个页面;
  • back() - 将历史记录向后移动一个页面;

而还有一个 go() 方法也可以控制历史纪录,而且功能更加强大,使用此方法需要一个参数,这个参数值可以是正负整数、零和字符串,例如 history.go(-2) 将是当前页后退两页;如果给定的参数是字符串,那么浏览器就会搜索列表,找到最接近当前页面位置的并且地址 URL 中含有此字符串的页面,然后转到该页面。

请看,下边的两条语句是等价的:

history.go(-1);
history.back();

下边的代码将页面转到距离本页面位置最近的同时页面地址 URL 中含有字符串 "netscape" (不区分字母的大小写) 的页面:

history.go("netscape");

在使用这三个方法的时候,如果没有找到符合条件的历史记录的话,将不会发生任何变化,不会改变当前的页面,也不会显示错误。

小技巧:如果在你的网站中有很多页面,那么提供一个 “返回” 功能是很必要的,这样可以方便用户浏览你的网站,但是你并不知道用户是从哪一个页面来到当前页面的,于是你就不能使用 ... 的方式来做超链接了,但是可以使用下边的代码来做 “返回” 的超链接:

返回

改变窗口页面的内容

你可以使用 window 对象的 scroll() 方法使窗口/帧的内容滚动,这种滚动可以是水平方向的也可以是垂直方向的,在这个 在线示例 中,帧里边的美国各个城市天气变化的内容将会不停的滚动。

此例中,当页面滚动到一定的值 (此例中为 750 像素) 的时候,又将页面重新设置成最初的样子 (即坐标值为:(0,0)),这样看起来就是不停的滚动了。可惜的是,并不是所有的浏览器都提供实际的页面高和宽的像素值,所以你要亲自实践一下看看这些值要多大才合适。

你还可以重新书写一个页面中的内容,这就要用到 document 对象的 write() (此方法输出的时候不换行) 和 writeln() (此方法输出完成后自动换行)方法了。这两个方法需要一个字符串参数,这个参数就是要在页面中输出的字符串,可以在字符串中带上HTML代码,那样输出的结果就和其它网页是一样的了,看看这个 在线示例 ,查看一下源代码就知道了。这个例子中是上边的帧通过 writeln() 方法向下边的帧输出内容。

在此例中,你可以试一试输入一些 HTML 代码,看看有什么效果!比如说输入下边的代码:

在下边帧上,点击鼠标右键,查看一下源代码,你会发现源代码就是你输入的那些字符。

在函数 rewriteFrame() 中,有如下语句:

window.parent.frames["text"].document.writeln(document.forms[0].text.value);
window.parent.frames["text"].document.close();

第一条语句是将表单 (form) 的 text 中输入的内容写到下边的帧中,第二行代码是调用 document.close() 的方法告诉浏览器向页面写的操作已经结束。如果你想要是你的输入覆盖掉以前的,那就要使用 document 对象的 close() 方法。

【一个小小的改进】

你可能会注意到上边的例子中,当你点击浏览器的后退按钮的时候,你会看到你的每一次 “提交” 动作都产生了一个新的页面,他们都留在了历史记录中,所以像前边说的一样,你要按很多此 “后退” 才能会回到最初的页面,如果你想除掉这种情况,可以使用 document 对象的 open() 方法,只要在 rewriteFrame() 中加一条语句即可:

window.parent.frames["text"].document.open("text/html", "replace");
window.parent.frames["text"].document.writeln(document.forms[0].text.value);
window.parent.frames["text"].document.close();

open() 方法的第一个参数值 "text/html" 是用来告诉浏览器准备接受 HTML 数据,而第二个参数值 "replace" 告诉浏览器不要将新写入的页面加入到浏览器的历史记录列表中,和 location.replace(URL) 是很相似的,功能是一样的,请看改进后的 在线示例 。