JavaScript窗口功能指南之创建对话框

  • 发布于:2019-11-03
  • 201 人围观
   JavaScript支持几种内建的对话框:window.alert()、window.confirm()以及window.prompt()。当弹出一个对话框时,用户就不可以再聚焦到初始页面,除非对话框操作结束。换言之,对话框永远是被聚焦的。Internet Explorer支持一些方法,使用它们能让你在任何新窗口上应用它们:
  
    showModalDialog() (Internet Explorer 4 和以上版本)
  
    showModelessDialog() (Internet Explorer 5 和以上版本)
  
    以下是这些方法的语法:
  
    vReturnValue = window.showModalDialog(sURL[, vArguments][, sFeatures]);
  
    vReturnValue = window.showModelessDialog(sURL[, vArguments][, sFeatures]);
  
    第1个参数是一个字符串,它指定了在新窗口中装载并显示的文档URL。第2个参数,vArguments,是一个variant,它指定了显示文档的命令。使用这个参数时,可以传递任意类型的数组或者数值。对话框能够从window对象的dialogArguments属性中将数值传递给调用者。
  
    当通过其中一个方法打开一个新窗口时,新窗口(对话框)的window对象特写了dialogArguments属性,它包含了分配给调用方法的vArguments参数的数值。来看看下面的语句:
  
    window.showModalDialog("modalurl.html", window);
  
    注意,第2个命令参数实际上是当前浏览器窗口的window对象。下面是文件modalurl.html的代码:
  
    <HTML>
  
    <HEAD>
  
    <TITLE>Change the URL</TITLE>
  
    <SCRIPT LANGUAGE="JavaScript">
  
    <!--
  
    function load(menu) {
  
     if (window.dialogArguments && dialogArguments.location) {
  
      dialogArguments.location.href = menu.options[menu.selectedIndex].value;
  
      window.close();
  
     }
  
    }
  
    // -->
  
    </SCRIPT>
  
    </HEAD>
  
    <BODY>
  
    Pick your favorite investment site:<P>
  
    <FORM><SELECT NAME="menu">
  
    <OPTION VALUE="http://www.fool.com/">Fool.com (The Motley Fool)
  
    <OPTION VALUE="http://www.investor.com/">MoneyCentral Investor
  
    <OPTION VALUE="http://www.thestreet.com/">TheStreet.com
  
    </SELECT>
  
    <INPUT TYPE="button" VALUE="Load" onClick="load(this.form.menu)"></FORM>
  
    </BODY>
  
    </HTML>
  
    当用户在对话框中点击“Load”按钮,打开者窗口的URL就变为选择的数值。为了数值窗口文档的URL,我们必须分配一个数值给需要window对象的location.href属性。在这里,我们指定调用者的window对象做为showModalDialog()方法的第2个参数,所以,新窗口(对话框)中dialogArguments属性就对应于调用者的window对象。
  
    注意函数开始的对象检测程序段。因为dialogArguments属性只存在于由showModalDialog()和showModelessDialog()方法创建的窗口中,所以,我们必须确认在使用它们前这个属性是否存在。而且,我们需要查找一个location.href属性来确认dialogArguments属性真正地对应于一个合法的window对象。
  
    load()函数的最后语句关闭对话框,从而指定的文档能够在原始窗口被装载。注意,如果我们使用showModelessDialog()方法替代showModalDialog()方法,我们就不需要特别地关闭窗口,因为,即使对话框仍然打开时,新的URL依然会在下面的窗口(打开者)被装载。在这里,当调用者的URL改变时(调用新页面),对话框自动关闭。  当在Internet Explorer 5中执行showModelessDialog()时,出现一个对话框,它位于浏览器窗口前面。用户仍旧可以操纵下面的窗口,但是对话框会始终在上面。对话框与打开它的浏览器窗口相关联,所以,如果用户产生了一个不同的窗口,对话框与它的产生者一同被隐藏在后面。注意,一个modeless对话框实际上连接到一个包含产生它的脚本的文档,所以,如果用户在打开者窗口中装载另一个不同的URL,对话框将自动关闭。
  
    Internet Explorer 4 中的showModalDialog()方法就完全不同。它建立一个modal对话框,并一直保持焦点直到被关闭。用户根本不能访问到打开者窗口。一个modal对话框与打开它的浏览器窗口相关联,所以,如果用户产生一个不同的浏览器窗口,对话框就与它的原始窗口一起被隐藏在活动窗口的下面。
  
    现在是回来讨论showModalDialog()和showModelessDialog()方法的参数的时候了。第3个参数,sFeatures,是一个字符串,它指定了对话框窗口的修饰特征,具体就是使用下面的一个或者多个以逗号分隔的数值:
  
    dialogHeight: iHeight
  
    设置对话框窗口的高度。尽管用户能够手工地调整一个对话框的高度为一个较小数值(要求产生的对话框是大小可变的),但是你可以指定的最小dialogHeight是100象素(pixels)。注意,在Internet Explorer 4.0中dialogHeight和dialogWidth的默认测量单位“em”,而在Internet Explorer 5中则是px(象素)。为了保持一致性,当设计modal对话框时,请以象素为单位指定dialogHeight和dialogWidth。
  
    dialogWidth: iWidth
  
    设置对话框窗口的宽度。
  
    dialogLeft: iXPos
  
    设置对话框窗口相对于桌面左上角的left位置。
  
    dialogTop: iYPos
  
    设置对话框窗口相对于桌面左上角的top位置。
  
    center: {yes | no | 1 | 0 }
  
    指定是否将对话框在桌面上居中,默认值是“yes”。为了避免居中,你可以设定为dialogLeft或者dialogTop。
  
    help: {yes | no | 1 | 0 }
  
    指定对话框窗口中是否显示上下文敏感的帮助图标。默认值是“yes”。
  
    resizable: {yes | no | 1 | 0 } (Internet Explorer 5 and above)
  
    指定是否对话框窗口大小可变。默认值是“no”。
  
    status: {yes | no | 1 | 0 } (Internet Explorer 5 和以上版本)
  
    指定对话框窗口是否显示状态栏。对于非依赖对话框窗口,默认值是“yes”;对于依赖对话框窗口,默认值是 “no”。
  
  对象检测
    showModalDialog() 和 showModelessDialog() 方法并非被所有支持JavaScript的浏览器所支持。在调用任何一个方法之前,我们必须确认它们的有效性:
  
    if (window.showModalDialog) {
  
     ...
  
    }
  
    if (window.showModelessDialog) {
  
     ...
  
    }
  
    如果用户的浏览器不能支持需要的方法,你也许希望考虑一个可供选择的行为,这可以通过调用window.open()方法来实现:
  
    if (window.showModalDialog) {
  
     win = window.showModalDialog("mydialog.html", ...);
  
    } else {
  
     win = window.open("mydialog.html", ...);
  
    }
  
  一个交叉浏览器Modal对话框
    看看下面的定义 (Navigator适用):
  
    <BODY onBlur="window.focus()">
  
    如果你在< body >标记中使用上面的事件处理程序,那么包含文档的窗口就会被聚焦,直到用户关闭它。在这个仅Navigator适用的技术与Internet Explorer的showModalDialog()方法之间,有些区别。被聚焦的窗口没有与指定的窗口或者文档相关联。就是说,用户不能调上来其它浏览器窗口,即使不是打开对话框的窗口。
  JavaScript窗口功能指南之打开一个新窗口
  (作者:听风编译 2001年01月19日 11:35)
  
    当你点击一个简单的链接打开一个新窗口时,你没有对新窗口任何控制权。浏览器以默认的功能打开新窗口。此外,你也不能使用JavaScript引用新窗口的window对象,因此你不可能操纵新窗口的属性。看看下面的JavaScript语句:
  
    window.open("http://www.docjs.com/", "win");
  
    这条语句打开一个新窗口,显示页面http://www.docjs.com/。 新窗口的名字被赋值为 "win"。window对象的open()方法的基本语法是:
  
    window.open(sURL, sName);
  
    2个参数都是可选的,如果不想指定URL或者窗口名称,就使用空字符串("").
  
    sURL 是一个字符串,它指定了要显示文档的URL。如果不指定URL,就产生一个空窗口。 sName 是定义的窗口名字,这个名字被用于<form>或者<a>标记的 TARGET 属性。在Internet Explorer 5 和以后版本,如果定义这个数值为 "_search",那么就将在浏览器的搜索区打开 sURL 。
  
    如果带有同一参数sName执行window.open()方法2次,会发生什么呢?就象用HTML产生的窗口一样,如果你定义一个已经存在窗口的名字,那么open()方法将简单地利用存在的窗口,而不是打开一个新的。看看下面的脚本程序:
  
    window.open("http://www.javascript.com/", "win");
  
    window.open("http://www.docjs.com/", "win");
  
    执行上面的语句,浏览器将打开一个名字为“win”的新窗口,并在其中显示页面www.javascript.com。第2条语句替换当前窗口内容为页面www.docjs.com。下面的语句产生2个不同的窗口显示各自的内容:
  
    window.open("http://www.javascript.com/", "win1");
  
    window.open("http://www.docjs.com/", "win2");
  
    如果不指定新窗口的名字,浏览器就自动地产生一个新窗口。这同样适用于“_blank”,但是空字符串是另外一回事。对于Internet Explorer和Navigator,有几个重要的区别,如下:
  
  window.open("http://www.cnn.com/");
  window.open("http://www.usatoday.com/");
  Internet Explorer Navigator
  打开2个不同的窗口 打开2个不同的窗口
  
  window.open("http://www.cnn.com/", "_blank");
  window.open("http://www.usatoday.com/", "_blank");
  Internet Explorer Navigator
  打开2个不同的窗口 打开2个不同的窗口
  
  window.open("http://www.cnn.com/", "");
  window.open("http://www.usatoday.com/", "");
  Internet Explorer Navigator
  打开2个不同的窗口 只打开一个窗口,名字为空("")
  
    下面一行不会用到,只是列举出来。如果想命名窗口,就给出一个可以理解的名字(不是"")。如果不想命名,就干脆不指定这个参数,或者使用特殊的target位置"_blank"。
  
    关于open()方法的一个重要之处是:open()方法几乎总是以window.open()的形式被调用执行,即使window代表了全局对象从而可以彻底省略。由于document对象也有open()方法,所以当我们想打开一个新窗口时,指定window对象将会清晰必要。在事件处理中,必须指定window.open(),而不能简单地使用open()。由于JavaScript中静态对象的作用范围限制,没有指定对象名字的open()调用等价于document.open()。比如说,当一个HTML按钮的事件处理发生时,范围就包含了按钮对象、表单对象、文档对象,以及窗口对象。这样,如果那样一个事件处理器引用了open()方法,识别器在文档对象就中止,事件处理器打开一个新的文档,而不是打开一个新的窗口。
  
  返回值
    为了合适地引用子窗口,应该将window.open()的结果分配给一个变量。如果窗口被成功地创建,window.open()就返回新窗口对象,或者返回null表示创建失败(比如由于内存不足)。如果你的脚本程序需要引用新窗口的元素,返回值就是非常重要的。然而,当新窗口打开后,并没有“父-子”关系存在。看看下面的语句:
  
    var recentTips = window.open("http://www.docjs.com/tips/", "tips");
  
    这里,我们分配给新窗口的window对象一个变量值名叫recentTips。如果在函数中调用window.open()方法,记住一定要省略var关键字,因为变量应该是全局的。否则,window的引用就位于局部变量中,并且当函数执行完毕后就不能被访问。下面的语句在一个alert对话框中显示新窗口的URL:
  
    alert(recentTips.location.href);
  
    你也可以通过下面的方法改变新窗口的URL:
  
    recentTips.location.href = "http://www.usatoday.com/";
  
    在前面一节中,你已经看到了如何使用HTML链接和表单打开一个新窗口。通过指定target属性或者给window对象的name属性分配一个数值,我们就能够命名窗口。但是怎样才能通过它的html名字来引用存在的窗口呢?答案是简单的。如果你执行了带有空字符串的URL参数以及存在窗口名字的window.open()方法,这个窗口的引用就会被返回。看看下面的链接代码:
  
    <A HREF="http://www.cnet.com/" TARGET="news">CNET</A>
  
    当执行下面的语句时,就得到了新窗口的引用:
  
    var latestNews = window.open("", "news");
  
  让我们再试一试。点击这个链接 CNET,但它装载后,点击下面的按钮:
  
  
    这个按钮实际上取回了名字叫做“news”的窗口的引用,并且修改了那个窗口的URL。注意,如果在点击按钮前不点击那个链接,一个新的、空的窗口就被装载(因为指定的窗口名字不存在)。记住,不管窗口中的文档是什么,窗口始终保持着它的名字。下面是这个按钮相关的HTML和JavaScript代码:
  
    <SCRIPT LANGUAGE="JavaScript">
  
    <!--
  
    function changeURL(winName, newURL) {
  
     win = window.open("", winName);
  
     win.location.href = newURL;
  
    }
  
    // -->
  
    </SCRIPT>
  
    <FORM>
  
    <INPUT TYPE="button" VALUE="Load ZDNet"
  
    onClick="changeURL('news', 'http://www.zdnet.com/')">
  
    </FORM>
  
    前面一段脚本程序表明了如何获取一个存在窗口的引用。如果你仅仅想改变存在窗口的URL,你同样可以直接使用目标页面的URL来调用window.open()方法:
  
    function changeURL(winName, newURL) {
  
     win = window.open(newURL, winName);
  
    }
  
    在下面一节中,我们将讨论如何定制新窗口的外观
万企互联
标签: