标准参考
模态对话框 和 非模态对话框 的概念来自于 GUI 程序,实际上这两种对话框仍然是窗口的一种。
-
模态对话框在打开后会阻断其父窗口接受键盘及鼠标消息,并且使父窗口是去焦点。只有当用户关闭当前的模态对话框后,父窗口才可再次得到焦点以及恢复各种消息。典型的模态对话框有:打开/另存为对话框;
-
非模态对话框则不会阻断其父窗口接受键盘及鼠标消息,其父窗口仍然可以获得焦点。典型的非模态对话框有:查找/搜索对话框。
window.showModalDialog 方法不是 W3C 规范中的方法,其最初由 IE4 引入,用来创建一个模态对话框,并在其中显示 HTML 页面。其格式为:
vReturnValue = object.showModalDialog(sURL [, vArguments] [, sFeatures])
三个参数分别为:对话框加载的 HTML 页面的 URL、传入对话框页面的参数,控制对话框展现效果的参数。
其中可在对话框页面中通过 document.arguments 获得 vArguments 传入的参数的内容。
在 Firefox 3 中,也实现了对 window.showModalDialog 方法,其调用方式与IE类似,只是有个别参数没有实现。
关于 showModalDialog 方法的详细信息,请参考 MSDN 及 Mozilla Developer Center 中的内容。
window.showModelessDialog 方法也不是 W3C 规范中的方法,其最初由 IE5 引入,用来创建一个非模态对话框,并在其中显示 HTML页面。其格式为:
vReturnValue = object.showModelessDialog(sURL [, vArguments] [, sFeatures])
使用方法与 showModalDialog 类似。
关于 showModelessDialog 方法的详细信息,请参考 MSDN 中的内容。
问题描述
目前 Firefox 与 Safari 实现了与 IE 非常接近的 showModalDialog 方法,Chrome 中则是将其当做 window.open 方法处理,Opera 中暂时不支持此方法。
对于 showModelessDialog 方法,目前仅 IE 支持。
造成的影响
若在脚本代码中使用了 showModalDialog 与 showModelessDialog 方法,则可能会导致运行效果不是预期效果,甚至可能导致代码报错。
受影响的浏览器
Firefox Safari
不支持 showModelessDialog 方法。 |
Chrome
将 showModalDialog 方法当做 window.open 方法处理,不支持 showModelessDialog 方法。 |
Opera
不支持 showModalDialog 与 showModelessDialog 方法。 |
问题分析
首先分析各浏览器对 showModalDialog 方法的支持情况。
分析以下代码:
modaldialog.html
<input type= "text " id= "textbox " value= "defaultValue " /><br />
<button id= "open1 ">Open ModalDialog</button>
<script>
var updatetext = " ";
function update() {
document.getElementById( "textbox ").value = updatetext;
}
document.getElementById( "open1 ").onclick = function () {
window.showModalDialog( "inner.html ", window);
}
</script>
inner.html
<input type= "text " id= "dialogtext " /><button id= "ok ">OK!</button>
<script>
document.getElementById( "dialogtext ").value =
window.dialogArguments.document.getElementById( "textbox ").value;
document.getElementById( "ok ").onclick = function () {
window.dialogArguments.updatetext =
document.getElementById( "dialogtext ").value;
window.dialogArguments.update();
window.close();
}
</script>
上面代码中,modaldialog.html 使用 window.showModalDialog 方法创建模态对话框,载入 inner.html,并传入 modaldialog.html 页面的 window 对象。
页面 inner.html,打开后,文本框 INPUT[id= "dialogtext "] 的 value 初始值为页面 modaldialog.html 中文本框 INPUT[id= "textbox "] 的 value 值,当改变 INPUT[id= "dialogtext "] 的 value 值并点击 "OK " 按钮后,模态对话框关闭,页面 modaldialog.html 中文本框 INPUT[id= "textbox "] 的 value 值将变为模态对话框内文本框中的字符串。
这段代码在不同的浏览器环境中的表现如下:
IE6 IE7 IE8 Firefox Safari
Chrome
Opera
window.showModalDialog 返回值 = function
OK |
OK |
OK |
弹出对话框
OK |
OK |
FAIL |
对话框为模态对话框
OK |
FAIL |
FAIL |
对话框与父窗口通过 arguments 的交互
OK |
FAIL |
FAIL |
可见,各浏览器的 window 对象中均包含 showModalDialog 方法,且均返回 function () { [native code] }
。
- 在 IE Firefox Safari 中,对 showModalDialog 支持较好,弹出的窗口为模态对话框,父窗口失去焦点,且通过 arguments 参数,父窗口与模态对话框直接成功完成数据交互;
- 在 Chrome 中,虽然通过 showModalDialog 成功弹出了对话框,但此对话框并不是模态的,父窗口仍然可以获得焦点,且数据交互失败,很类似于 window.open 方法;
- 在 Opera 中,虽然 window.showModalDialog 返回为真,但弹不出对话框,也不能实现其功能。
下面分析各浏览器对 showModelessDialog 方法的支持情况。
modelessdialog.html
<input type="text" id="textbox" value="defaultValue" /><br />
<button id="open1">Open ModelessDialog</button>
<script>
var updatetext = "";
function update() {
document.getElementById("textbox").value = updatetext;
}
document.getElementById("open1").onclick = function () {
window.showModelessDialog("inner.html", window);
}
</script>
inner.html
<input type="text" id="dialogtext" /><button id="ok" >OK!</button>
<script>
document.getElementById("dialogtext").value =
window.dialogArguments.document.getElementById( "textbox").value;
document.getElementById("ok").onclick = function () {
window.dialogArguments.updatetext =
document.getElementById("dialogtext").value;
window.dialogArguments.update();
window.close();
}
</script>
上面代码和上一段的类似,只不过将 showModalDialog 方法换成了 showModelessDialog 方法。
这段代码在不同的浏览器环境中的表现如下:
IE6 IE7 IE8
Firefox Chrome Safari Opera
window.showModelessDialog 返回值 = function
OK |
FAIL |
showModelessDialog 方法目前仅被 IE 支持,在其他浏览器中 window.showModelessDialog 均返回 "undefined " 。
解决方案
showModalDialog 方法与 showModelessDialog 方法均不被 W3C 支持,虽然 showModalDialog 方法目前已比较广泛的被支持,但还是应避免使用它。因为模态对话框会阻塞父窗口的输入,使其是去焦点,这将对用户体验不利。
- 对于 showModalDialog 方法可以使用模拟模态对话框的方式,比如通过半透明 DIV 元素遮住页面主体,在其之上显示 "对话框 " 内容。
- 对于 showModelessDialog 方法可以使用 window.open 代替。
分享到:
相关推荐
javascript中window.confirm这个方法很好用,可以弹出一个确认对话框我们之所以弹出这个对话框,可能就是因为该操作很危险,所以要用户确认。但如果默认选择”确定”,则可能违背了这个原则。 另外,confirm对话框的...
对window.open进行封装, 使其更好用, 且更兼容, 很多人说window.open不兼容,其实不是, 因为不能直接执行, 必须通过用户手动触发才行;看代码: 代码如下 var openWindow = function(url, options) { var str = ""; ...
首先,`window.print()` 方法是JavaScript中的一个全局函数,它会触发浏览器的打印对话框,允许用户选择打印当前页面或对其进行自定义设置。在调用此方法后,浏览器会尝试呈现当前窗口的内容,包括文本、图像、表格...
- 在多浏览器兼容性方面,虽然`setInterval`和`clearInterval`在现代浏览器中普遍可用,但在一些较老版本的浏览器中可能表现不一致。 综上所述,`window.setInterval`和`window.clearInterval`是JavaScript中非常...
在JavaScript的世界里,`window`对象是全局对象,它提供了与浏览器窗口进行交互的各种方法和属性。本篇文章将深入探讨`window.open()`、`window.opener`、`window.name`以及`window`对象的一些核心概念,同时通过两...
window.open() 函数在 JavaScript 中的应用详解 window.open() 函数是 JavaScript 中一个非常重要的函数,用于打开一个新的浏览器窗口或标签页。在实际开发中,我们经常需要使用 window.open() 函数来打开新的页面...
### JS弹出对话框 `window.showModalDialog()` 的使用与详解 #### 一、`window.showModalDialog()` 概述 在JavaScript中,`window.showModalDialog()` 是一个非标准但广泛使用的API,用于创建模态对话框。模态...
It was tested in the latest Google Chrome with the *Enable Experimental JavaScript* flag enabled in `chrome://flags/#enable-javascript-harmony` and in the latest Mozilla Firefox with the *dom.dialog_...
在JavaScript的世界里,`window.open`、`iframe`和`dialog`是三个非常重要的概念,它们在网页交互和页面通信中扮演着关键角色。这里我们将深入探讨这些知识点,并结合实例来帮助你理解它们的用法。 1. `window.open...
在JavaScript编程中,`window.setTimeout()`函数是一个非常重要的异步编程工具,它允许开发者在指定的时间后执行特定的代码片段。这一特性对于实现延迟操作、计时器等功能非常有用。 #### 二、`window.setTimeout()...
### JavaScript中Window.open参数详解 #### 1. 最基本的弹出窗口代码 在Web开发中,`window.open` 方法是非常实用的一个功能,它可以用来创建一个新的浏览器窗口或标签页,并加载指定的URL。最简单的使用方式如下...
在JavaScript中,`showModalDialog`是一个原生的浏览器函数,它会打开一个新的窗口或对话框,并可以设置为模态,这样用户必须先关闭对话框才能继续操作主窗口。 使用`showDialog`时,我们可以指定对话框的URL、宽度...
在JavaScript编程中,`window.alert()` 是一个内置的全局函数,用于向用户显示警告对话框,通常包含一条消息和一个“确定”按钮。这个方法在网页开发中常用于简单的信息提示,但有时开发者可能需要自定义其行为,...
本文将深入探讨`Window`对象的一些关键函数,这些函数在前端开发中极为常见,能够显著提升JavaScript编码水平。 #### 1. `alert`函数:弹出警告对话框 `alert`函数是最基本也是最常用的`Window`方法之一,用于向...
`window.showModalDialog`和`window.open`是JavaScript中用于实现这一目标的两个关键函数。它们都可以创建新窗口,但有着不同的特性和使用场景。 首先,`window.open()`是一个广泛使用的函数,它可以在浏览器中打开...
- 对于需要跨浏览器兼容的应用,推荐使用 `window.open`,并根据需求通过其他技术(如 CSS、JavaScript 库等)模拟模态对话框的行为。 总的来说,虽然 `ShowModalDialog` 在某些场景下提供了更强大的功能,但由于其...
`window.open()`是JavaScript中的一个内置函数,用于在...总之,`window.open()`函数在不同浏览器中的表现有显著差异,开发者在使用时需要充分考虑兼容性问题,进行适当的适配,以确保在不同环境下都能得到预期的效果。
在Web开发中,`window.open` 是一个JavaScript函数,它用于打开新的浏览器窗口或标签页。这个函数在处理用户交互,比如点击按钮打开新页面,或者在不同窗口间传递数据时非常常见。当我们谈论“window.open父子窗口...
火狐浏览器不支持window.event的解决办法,解决不同浏览器针对window.event的差异