`

js里window.showXXXXXXX 函数兼容性

 
阅读更多

标准参考

模态对话框非模态对话框 的概念来自于 GUI 程序,实际上这两种对话框仍然是窗口的一种。

  • 模态对话框在打开后会阻断其父窗口接受键盘及鼠标消息,并且使父窗口是去焦点。只有当用户关闭当前的模态对话框后,父窗口才可再次得到焦点以及恢复各种消息。典型的模态对话框有:打开/另存为对话框;
  • 非模态对话框则不会阻断其父窗口接受键盘及鼠标消息,其父窗口仍然可以获得焦点。典型的非模态对话框有:查找/搜索对话框。

window.showModalDialog 方法不是 W3C 规范中的方法,其最初由 IE4 引入,用来创建一个模态对话框,并在其中显示 HTML 页面。其格式为:

vReturnValue  = object.showModalDialog(sURL [, vArguments] [, sFeatures])

三个参数分别为:对话框加载的 HTML 页面的 URL、传入对话框页面的参数,控制对话框展现效果的参数。

其中可在对话框页面中通过 document.arguments 获得 vArguments 传入的参数的内容。

在 Firefox 3 中,也实现了对 window.showModalDialog 方法,其调用方式与IE类似,只是有个别参数没有实现。

关于 showModalDialog 方法的详细信息,请参考 MSDNMozilla 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 Chrome Opera
不支持 showModelessDialog 方法。
将 showModalDialog 方法当做 window.open 方法处理,不支持 showModelessDialog 方法。
不支持 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 弹出对话框 对话框为模态对话框 对话框与父窗口通过 arguments 的交互
OK OK OK
OK OK FAIL
OK FAIL FAIL
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的行为

    javascript中window.confirm这个方法很好用,可以弹出一个确认对话框我们之所以弹出这个对话框,可能就是因为该操作很危险,所以要用户确认。但如果默认选择”确定”,则可能违背了这个原则。 另外,confirm对话框的...

    Javascript中封装window.open解决不兼容问题

    对window.open进行封装, 使其更好用, 且更兼容, 很多人说window.open不兼容,其实不是, 因为不能直接执行, 必须通过用户手动触发才行;看代码: 代码如下 var openWindow = function(url, options) { var str = ""; ...

    html和js通过window.print()实现调用浏览器打印带背景图片和生成二维码的文件功能

    首先,`window.print()` 方法是JavaScript中的一个全局函数,它会触发浏览器的打印对话框,允许用户选择打印当前页面或对其进行自定义设置。在调用此方法后,浏览器会尝试呈现当前窗口的内容,包括文本、图像、表格...

    window.clearInterval与window.setInterval的用法.

    - 在多浏览器兼容性方面,虽然`setInterval`和`clearInterval`在现代浏览器中普遍可用,但在一些较老版本的浏览器中可能表现不一致。 综上所述,`window.setInterval`和`window.clearInterval`是JavaScript中非常...

    字符串 window.open() window.opener window.name window对象等的总结

    在JavaScript的世界里,`window`对象是全局对象,它提供了与浏览器窗口进行交互的各种方法和属性。本篇文章将深入探讨`window.open()`、`window.opener`、`window.name`以及`window`对象的一些核心概念,同时通过两...

    js中window.open打开一个新的页面.docx

    window.open() 函数在 JavaScript 中的应用详解 window.open() 函数是 JavaScript 中一个非常重要的函数,用于打开一个新的浏览器窗口或标签页。在实际开发中,我们经常需要使用 window.open() 函数来打开新的页面...

    JS 弹出对话框window.showModalDialog()

    ### JS弹出对话框 `window.showModalDialog()` 的使用与详解 #### 一、`window.showModalDialog()` 概述 在JavaScript中,`window.showModalDialog()` 是一个非标准但广泛使用的API,用于创建模态对话框。模态...

    google不支持window.showModalDialog问题解决方案

    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_...

    js window.open iframe dialog

    在JavaScript的世界里,`window.open`、`iframe`和`dialog`是三个非常重要的概念,它们在网页交互和页面通信中扮演着关键角色。这里我们将深入探讨这些知识点,并结合实例来帮助你理解它们的用法。 1. `window.open...

    JavaScript_window.setTimeout()_的详细用法

    在JavaScript编程中,`window.setTimeout()`函数是一个非常重要的异步编程工具,它允许开发者在指定的时间后执行特定的代码片段。这一特性对于实现延迟操作、计时器等功能非常有用。 #### 二、`window.setTimeout()...

    JavaScript中Window.open参数

    ### JavaScript中Window.open参数详解 #### 1. 最基本的弹出窗口代码 在Web开发中,`window.open` 方法是非常实用的一个功能,它可以用来创建一个新的浏览器窗口或标签页,并加载指定的URL。最简单的使用方式如下...

    Window.showDialog详解合集

    在JavaScript中,`showModalDialog`是一个原生的浏览器函数,它会打开一个新的窗口或对话框,并可以设置为模态,这样用户必须先关闭对话框才能继续操作主窗口。 使用`showDialog`时,我们可以指定对话框的URL、宽度...

    重写window.alert方法

    在JavaScript编程中,`window.alert()` 是一个内置的全局函数,用于向用户显示警告对话框,通常包含一条消息和一个“确定”按钮。这个方法在网页开发中常用于简单的信息提示,但有时开发者可能需要自定义其行为,...

    js window函数用法大全.

    本文将深入探讨`Window`对象的一些关键函数,这些函数在前端开发中极为常见,能够显著提升JavaScript编码水平。 #### 1. `alert`函数:弹出警告对话框 `alert`函数是最基本也是最常用的`Window`方法之一,用于向...

    window.showModalDialog以及window.open用法简介

    `window.showModalDialog`和`window.open`是JavaScript中用于实现这一目标的两个关键函数。它们都可以创建新窗口,但有着不同的特性和使用场景。 首先,`window.open()`是一个广泛使用的函数,它可以在浏览器中打开...

    ShowModalDialog与window.open的区别

    - 对于需要跨浏览器兼容的应用,推荐使用 `window.open`,并根据需求通过其他技术(如 CSS、JavaScript 库等)模拟模态对话框的行为。 总的来说,虽然 `ShowModalDialog` 在某些场景下提供了更强大的功能,但由于其...

    window.open()详解及浏览器兼容性问题示例探讨

    `window.open()`是JavaScript中的一个内置函数,用于在...总之,`window.open()`函数在不同浏览器中的表现有显著差异,开发者在使用时需要充分考虑兼容性问题,进行适当的适配,以确保在不同环境下都能得到预期的效果。

    window.open父子窗口传值问题

    在Web开发中,`window.open` 是一个JavaScript函数,它用于打开新的浏览器窗口或标签页。这个函数在处理用户交互,比如点击按钮打开新页面,或者在不同窗口间传递数据时非常常见。当我们谈论“window.open父子窗口...

    火狐浏览器不支持window.event的解决办法

    火狐浏览器不支持window.event的解决办法,解决不同浏览器针对window.event的差异

Global site tag (gtag.js) - Google Analytics