http://www.computerworld.com.cn 作者: 甘冀平 (2002-01-29 20:41:38)

我们知道,对话框一般分为两种类型:模态类型(modal)与非模态类型(modeless)。所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换。本文介绍如何使用JavaScript语言来创建这两种类型的对话框、控制其大小和位置、改变其外观以及在对话框间的数据传递。

本文的所有例程中,从层次上涉及到2个HTML页面。我们把第一个页面叫做caller页面,第二个页面叫做callee页面。也就是说,在caller页面执行代码创建生成callee页面。

一、创建模态和非模态对话框

首先,我们举个例子来快速了解一下什么是模态与非模态。在caller.htm中,我们输入以下代码:

function fnOpenModal(){

window.showModalDialog("callee.htm")

}

function fnOpenModeless(){

window.showModelessDialog("callee.htm")

}

在浏览器中打开caller.htm,点击“创建模态对话框”按钮,将会出现一个对话框窗口,其中的内容是callee.htm。你会看到,除了关闭这个新窗口,无论怎样我们也不能将其他的窗口设置为“当前活动”窗口,这个一直是活动状态的窗口类型就是模态类型。关闭这个模态对话框,回到caller.htm页面,点击“创建非模态对话框”,出现一个包含callee.htm页面的对话框窗口。这回有所不同,鼠标可以转移到其他地方使另外的窗口成为“当前活动”状态,这就是非模态的概念。

接下来,我们看看创建模态对话框与非模态对话框的相关语法:

创建模态对话框:

vReturnValue = window.showModalDialog(sURL [, vFreeArgument] [, sOrnaments]);

创建非模态对话框:

vReturnValue = window.showModelessDialog(sURL [, vFreeArgument] [, sOrnaments]);

从上面的语法我们得知:除了名字有所区别外,参数种类与含义都相同。以下是各参数的含义:

· VReturnValue:对于showModalDialog(),它表示被打开的对话框窗口设置的returnValue属性值。对于showModelessDialog(),它表示新窗口对象。

· VFreeArgument:这个参数可用于传递某种类型的数据到打开的对话框,数据可以是一个数值、字符串、数组或者一个对象类型。在新窗口中引用这个数值时,可通过新创建window对象的dialogArguments 属性。

· SOrnaments:用这个参数指定新窗口的外观。可选择的窗口属性有很多种,当有多种控制需求时,将相关内容用一个字符串连接起来,其间用分号隔开。以下是可选择的属性种类:

o dialogHeight: sHeight

o dialogLeft: sXpos

o dialogTop: sYpos

o dialogWidth: sWidth

o center: ( yes | no | 1 | 0 | on | off )

o dialogHide: ( yes | no | 1 | 0 | on | off )

o edge: ( sunken | raised )

o help: ( yes | no | 1 | 0 | on | off )

o resizable: ( yes | no | 1 | 0 | on | off )

o scroll: ( yes | no | 1 | 0 | on | off )

o status: ( yes | no | 1 | 0 | on | off )

除了以上属性外,我们还可以加入更加丰富的CSS控制。 以下我们来详细解释如何应用这些属性。

二、控制对话框大小和位置

控制对话框的大小和位置涉及到5个方面:高度(dialogHeight)、宽度(dialogWidth)、相对于桌面左上角的x坐标(dialogLeft)、y坐标(dialogTop)以及是否让对话框窗口居中(center)。由于不同版本的Internet Explorer浏览器处理的默认度量单位并非一致,所以我们在指定高度、宽度等大小时,最好是同时设置好单位。单位种类包括很多,比如cm、mm、in、pt、pc、px。请注意:最小的高度值是100px。

下面的代码将打开一个高200px、宽800px的对话框:

window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px');

我们注意到,打开的新窗口会在桌面中处于居中的位置,这也正是居中属性(center)的默认值。居中属性(center)的可取值包括yes、no、1、0、on和off,含义一目了然。执行以下代码,看看关闭居中属性后新窗口的位置:

window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;center:no');

我们看到,新窗口紧挨者桌面的左上角打开。当然,我们可以使用dialogLeft和dialogTop 属性来精确定义新窗口的打开位置。下面的代码将在相对于桌面左上角的x位置300px和y位置500px处打开新窗口:

window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;dialogLeft:300;

dialogTop:500')

注意,即使指定了居中属性,但如果同时设置了dialogLeft和dialogTop属性值,那么窗口位置将遵从后者。试一试执行下面的代码:

window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;dialogLeft:300;

dialogTop:500;center:yes')

三、改变对话框外观

对话框的外观控制包括从窗口边缘风格(edge)、是否存在滚动条(scroll)、是否包含上下文关联提示图标(help)、是否显示状态栏(status)以及是否可以改变窗口大小(resizable)等方面。默认情况下,新打开的窗口是大小不可改变的、边缘风格为凸起、在新窗口右上角显示一个上下文关联提示图标、存在滚动条,比如:

edge的可取值为sunken(凹陷)和raised(凸起),status、help、resizeable和scroll的可取值都是yes、no、1、0、on和off,其含义一目了然。

下面的代码将去除上下文关联提示图标、不显示状态栏、窗口边缘风格为凹陷:

showModelessDialog("callee.htm","","status:0;help:0;edge:sunken");

执行后,图示如下:

四、从caller页面传递数据到callee页面

上面我们介绍了创建模态和非模态窗口的语法以及如何控制新窗口的大小、位置和外观,接下来我们研究一下实际应用中更实用的功能:如何从caller页面传递数据到callee页面。

从caller页面传递给callee页面的数据分为3类:传递值、传递数组引用以及传递对象,它们都是通过showModalDialog()和showModelessDialog()的第2个参数实现的。

(一)传递值类型数据

在caller.htm页面中输入以下代码:

在callee.htm页面中输入以下代码:

在浏览器中打开caller.htm,点击任意一个按钮,我们将首先看到如下的提示信息框:

然后才出现新窗口。这种情况下,callee.htm页面中的window对象的属性dialogArguments将对应于caller.htm页面中的"打开了一个新模态窗口"或者"打开了一个新非模态窗口"。如果直接打开callee.htm,将会出现错误提示。

(二)传递数组引用类型数据

第一种值类型数据的传递中,在callee.htm页面中只能读取caller.htm页面的传递数据。当需要对caller.htm页面的传递内容进行修改时,就需使用到数组引用类型的传递方式。

首先,在caller.htm页面中输入以下代码:

然后在callee.htm页面中输入以下代码:

最后,在浏览器中打开caller.htm,点击任意一个按钮,我们将首先看到如下的对话框:

接着关闭这个对话框以及新打开的窗口,再次点击一个按钮,又出现一个对话框:

从运行结果我们看到,在caller.htm页面中通过对数组a的地址引用,就可以实现在callee.htm中修改数组a的内容。

注意在callee.htm中要首先建立对传递数据的附值:a = dialogArguments。

(三)传递对象类型数据

在caller.htm和callee.htm中传递数据的最有效方式是通过对象方式进行,这不仅能实现从caller.htm到callee.htm的传递,还能从callee.htm传递到caller.htm。而且,我们还可以在caller.htm中定义对象的方法,再在callee.htm中使用它们。实际上,我们可以将caller.htm的window对象传递给callee.htm,这样就可以在callee.htm中访问caller.htm的变量及函数。

来看看一个实际的例子。在caller.htm中输入以下代码:

传递对象数据

var sColor="";

function callDialog() {

showModelessDialog("callee.html",window,"status:false;dialogWidth:300px;dialogHeight:150px");

}

function update()

{

oColor.innerText = sColor;

}

输入你最喜欢的颜色: Yellow

在callee.htm中输入以下代码:

callee.html

function getInfoAndUpdate() {

var callerWindowObj = dialogArguments;

callerWindowObj.sColor = oEnterColor.value;

callerWindowObj.update();

}

function cancel() {

var callerWindowObj = dialogArguments;

callerWindowObj.sColor = "Yellow";

callerWindowObj.update();

}

输入你最喜欢的颜色:

在浏览器中打开caller.htm,点击“显示非模态对话框”按钮,出现新对话框:

在对话框中输入其他颜色名称,点击“Apply”按钮后,执行callee.htm中的getInfoAndUpdate函数:

function getInfoAndUpdate() {

var callerWindowObj = dialogArguments;

callerWindowObj.sColor = oEnterColor.value;

callerWindowObj.update();

}

因为在caller.htm中传递给callee.htm的是对象类型数据window,所以经过第一条语句的附值,callerWindowObj就指向了caller.htm页面,然后就可以在callee.htm中按照callerWindowObj.xxx的形式引用caller.htm中的变量及函数:callerWindowObj.sColor = oEnterColor.value负责将callee.htm中输入的颜色名称传递给caller.htm中的变量sColor,然后再执行caller.htm中的 update()函数更新显示信息。

可以看到,通过对象方式传递数据,功能很丰富强大,而且使用起来也不复杂。

六、结 语

以上对使用JavaScript语言操作模态和非模态对话框进行了详细介绍,相信你又掌握了在html页面中创建窗口的一个新技术。在实际应用中,模态对话框的功能比较实用,可用于必须让访问者阅读相关内容的情况下。另外,利用对象方式在窗口间传递数据,功能非常强大但使用却不复杂,是非常值得一用的技术。

posted on 2007-10-09 10:00 lk 阅读(264) 评论(0)  编辑  收藏 所属分类: ajax&js

Copyright ©2021 lk Powered by: 博客园 模板提供:沪江博客

java 非模态_JavaScrip高级应用:操作模态与非模态对话框相关推荐

  1. Java经典基础与高级面试36题和答案

    在Java面试的首轮,经常会问很多关于Java面试基础以及高级的问题,今天收集相关Java面试36题和答案分享出来. 1."static"关键字是什么意思?Java中是否可以覆盖( ...

  2. 【Java书笔记】:《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2部分-自动内存管理,第3部分-虚拟机执行子系统,第5部分-高效并发

    作者:周志明 整理者GitHub:https://github.com/starjuly/UnderstandingTheJVM 第2部分-自动内存管理 第2章 Java内存区域与内存溢出异常 2.2 ...

  3. 读书笔记之《深入理解Java虚拟机:JVM高级特性与最佳实践》

    本篇带来的是周志明老师编写的<深入理解Java虚拟机:JVM高级特性与最佳实践>,十分硬核! 全书共分为 5 部分,围绕内存管理.执行子系统.程序编译与优化.高效并发等核心主题对JVM进行 ...

  4. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记

    前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...

  5. Java从入门到精通——数据库篇之JAVA中的对Oracle数据库操作

    在Java中对Oracle数据库的操作分为两种:一.查询.二.非查询. 下面是我对其进行总结: 一.查询数据 /** * 根据用户代码查询* @param userId* @return 如果存在返回 ...

  6. java日志——基本日志+高级日志

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java日志--基本日志+高级日志 的相关知识: [1]记录日志 1.1)出现的问题和解决方法 ...

  7. Java 从入门到高级学习路线

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Java 从入门到高级学习路线 <一>1.Jvm 部分 Jvm 内存模型.Jvm 内存结 ...

  8. java授查 非授查异常_java检查异常与非检查异常

    Java的可检测异常和非检测异常泾渭分明.可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则. 非检测异常不遵循处理或声明规则.在产生此类异常时,不一定非要采取任何适当 ...

  9. 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作常见问题解答

    金蝶KIS商贸高级版操作常见问题解答 金蝶KIS商贸高级版操作常见问题有哪些你知道吗?你知道如何解决金蝶KIS商贸高级版操作常见问题吗?下面是yjbys小编为大家带来的金蝶KIS商贸高级版操作常见问题 ...

最新文章

  1. 大型网站技术架构(二)架构模式
  2. Sedgwick Museum of Earth Sciences
  3. delphi指针简单入门
  4. PyTorch教程(九):损失函数与Loss的梯度
  5. module.js:549 throw err;
  6. excel导出_SpringBoot实现快速导出Excel
  7. 代数学笔记3: 分裂域
  8. bzoj3130 [SDOI2013]费用流 结论+二分答案+网络流检验
  9. 【Elasticsearch】Elasticsearch高级调优方法论之——根治慢查询!
  10. 【Flink】java.lang.NumberFormatException: Not a version: 9
  11. response.getWriter().write()与out.print()的区别
  12. 初探HTML5.x新特性《dialog》标签
  13. Sql优化之Mysql表分区
  14. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_6_字符输出流写数据的其他方法...
  15. 张家界航空工业职业学院计算机,张家界航空工业职业技术学院2021年招生代码...
  16. python求一元三次方程的根_方程的计算机处理924_Fortran
  17. Spring Validation的校验顺序问题解决方案(建议读到最后,有大坑)
  18. Cascade R-CNN: Delving into High Quality Object Detection(个人学习笔记)
  19. dhl寄件邮编错了_DHL国际快递寄错国家怎么办?
  20. 流体力学基础——简介

热门文章

  1. mybatis动态SQL增删改查
  2. 解决问题:long型数据精度丢失
  3. 2021-08-20 WPF控件专题 DataGrid控件详解
  4. ARM Cortex-A系列(A53、A57、A73等)
  5. webpack Promis is undefine
  6. MAC 清理Adobe注册信息
  7. DCMTK DCMScu和DCMScp 细节讨论
  8. vue 使用vue-print-nb打印element表格展示不全
  9. python与matlab的优缺点
  10. Anaconda 彻底删除虚拟环境