JavaScript窗口功能指南之创建对话框
(作者:听风编译 2001年01月19日 11:35)

  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()方法之间,有些区别。被聚焦的窗口没有与指定的窗口或者文档相关联。就是说,用户不能调上来其它浏览器窗口,即使不是打开对话框的窗口。
 
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-7 10:40:38 | By: jingyuanke ]
 

一、showModalDialog和showModelessDialog有什么不同?
  showModalDialog:被打开后就会始终保持输入焦点。除非对话框被关闭,否则用户无法切换到主窗口。类似alert的运行效果。
  showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。:P)

二、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?
  在被打开的网页里加上<base target="_self">就可以了。这句话一般是放在<html>和<body>之间的。

三、怎样才刷新showModalDialog和showModelessDialog里的内容?
  在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠javascript了,以下是相关代码:

<body onkeydown="if (event.keyCode==116){reload.click()}">
<a id="reload" href="filename.htm" style="display:none">reload...</a>

  将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要配合<base target="_self">使用,不然你按下F5会弹出新窗口的。

四、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。
  <input type="button" value="关闭" onclick="window.close()">
  也要配合<base target="_self">,不然会打开一个新的IE窗口,然后再关掉的。

五、showModalDialog和showModelessDialog数据传递技巧。
  (作者语:本来想用一问一答形式来写的,但是我想不出这个怎么问,所以只好这样了。)
  这个东西比较麻烦,我改了好几次了不是没办法说明白(语文水平越来越差了),只好用个例子说明了。
  例子:
    现在需要在一个showModalDialog(或showModelessDialog)里读取或设置一个变量var_name

      一般的传递方式:
        window.showModalDialog("filename.htm",var_name)
        //传递var_name变量
      在showModalDialog(或showModelessDialog)读取和设置时:
        alert(window.dialogArguments)//读取var_name变量
        window.dialogArguments="oyiboy"//设置var_name变量
    这种方式是可以满足的,但是当你想在操作var_name同时再操作第二个变理var_id时呢?就无法再进行操作了。这就是这种传递方式的局限性。
    
      以下是我建议使用的传递方式:
        window.showModalDialog("filename.htm",window)
        //不管要操作什么变量,只直传递主窗口的window对象
      在showModalDialog(或showModelessDialog)读取和设置时:
        alert(window.dialogArguments.var_name)//读取var_name变量
        window.dialogArguments.var_name="oyiboy"//设置var_name变量

        同时我也可以操作var_id变量
        alert(window.dialogArguments.var_id)//读取var_id变量
        window.dialogArguments.var_id="001"//设置var_id变量

        同样还可以对主窗口的任何对象进行操作,如form对象里的元素。
        window.dialogArguments.form1.index1.value="这是在设置index1元素的值"

六、多个showModelessDialog的相互操作。
  因为光说很费劲,我就偷点懒,直接用代码来说了,如果不明白的话那就直接来信(oyiboy#163.net(使用时请将#改成@))问我吧。

  以下代码的主要作用是在一个showModelessDialog里移动别一个showModelessDialog的位置。

  主文件的部份js代码。
  var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px") //打开控制窗口
  var s2=showModelessDialog('about:blank',window,"dialogTop:200px;dialogLeft:300px")  //打开被控制窗口

  控制.htm的部份代码。
  <script>
    //操作位置数据,因为窗口的位置数据是"xxxpx"方式的,所以需要这样的一个特殊操作函数。
 function countNumber(A_strNumber,A_strWhatdo)
 {
  A_strNumber=A_strNumber.replace('px','')
  A_strNumber-=0
  switch(A_strWhatdo)
  {
  case "-":A_strNumber-=10;break;
  case "+":A_strNumber+=10;break;
  }
  return A_strNumber + "px"
 }
  </script>
  <input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'-')" value="上移">
  <input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'-')" value="左移">
  <input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'+')" value="右移">
  <input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'+')" value="下移">

  以上关键部份是:
    窗口命名方式:var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px")
    变量访问方式:window.dialogArguments.s2.dialogTop

  这个例子只是现实showModelessDialog与showModelessDialog之间的位置操作功能,通过这个原理,在showModelessDialog之间相互控制各自的显示页面,传递变量和数据等。这要看各位的发挥了。

 
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 9:32:30 | By: jingyuanke(游客) ]
 
document.all[]不符合WEB标准,那用什么来替代它呢?document.getElementById
WEB标准下可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问DOCUMENT中的任一个标签:

1、getElementById()
getElementById()可以访问DOCUMENT中的某一特定元素,顾名思义,就是通过ID来取得元素,所以只能访问设置了ID的元素。
比如说有一个DIV的ID为docid:
<div id="docid"></div>
那么就可以用getElementById("docid")来获得这个元素。
2、getElementsByName()
这个是通过NAME来获得元素,但不知大家注意没有,这个是GET ELEMENTS,复数ELEMENTS代表获得的不是一个元素,为什么呢?
因为DOCUMENT中每一个元素的ID是唯一的,但NAME却可以重复。打个比喻就像人的身份证号是唯一的(理论上,虽然现实中有重复),但名字

重复的却很多。如果一个文档中有两个以上的标签NAME相同,那么getElementsByName()就可以取得这些元素组成一个数组。

比如有两个DIV:
<div name="docname" id="docid1"></div>
<div name="docname" id="docid2"></div>
那么可以用getElementsByName("docname")获得这两个DIV,用getElementsByName("docname")[0]访问第一个DIV,用getElementsByName

("docname")[1]访问第二个DIV。
3、getElementsByTagName()
这个呢就是通过TAGNAME(标签名称)来获得元素,一个DOCUMENT中当然会有相同的标签,所以这个方法也是取得一个数组。
下面这个例子有两个DIV,可以用getElementsByTagName("div")来访问它们,用getElementsByTagName("div")[0]访问第一个DIV,用

getElementsByTagName("div")[1]访问第二个DIV。
总结一下标准DOM,访问某一特定元素尽量用标准的getElementById(),访问标签用标准的getElementByTagName(),但IE不支持

getElementsByName(),所以就要避免使用getElementsByName(),但getElementsByName()和不符合标准的document.all[]也不是全无是处,它

们有自己的方便之处,用不用那就看网站的用户使用什么浏览器,由你自己决定了。
 
个人主页 | 引用 | 返回 | 删除
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 9:34:07 | By: jingyuanke(游客) ]
 
关于document.getElementsByName
IE当然支持 可以说IE更忠于html/xhtml标准(嘿嘿 原来firefox也不咋地 幸灾乐祸一下^_^)
按照O'REILLY的<<HTML与XHTML权威指南>>中的说法 name并不是核心属性 并非所有标签都可以加name属性(大家可以拿我下面的例子去 validator.w3.org 做验证)
所以你给div加name属性理论上是不会出结果的.这一点IE很好的符合了标准~!!
(同时也看出了符合标准也有烦人的地方~_~ 所以大家不用太把标准当回事儿 过两年都用xml了 这个也过时了!倡导灵活的webstandard应用思想 除了符合xml思想的东西 其他的按浏览器的理解去做就行)
 
个人主页 | 引用 | 返回 | 删除
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 9:34:47 | By: jingyuanke(游客) ]
 
1、DOM

    WEB标准现在可真是热门中热门,不过下面讨论的是一个不符合标准的document.all[]。
    DOM--DOCUMENT OBJECT MODEL文档对象模型,提供了访问文档对象的方法.
    例如文档中有一个table,你要改变它的背景颜色,那就可以在JAVASCRIPT中用document.all[]访问这个TABLE。但DOM也有所不同,因    

为浏览器厂商之间的竞争,各浏览器厂商都开发了自己的私有DOM,只能在自己的浏览器上正确运行,document.all[]就是只能运行在    IE是

的微软的私有DOM。为了正确理解DOM,给出IE4的DOM
    click for full size



2、理解document.all[]

    从IE4开始IE的object model才增加了document.all[],来看看document.all[]的Description:
    Array of all HTML tags in the document.Collection of all elements contained by the object.
    也就是说document.all[]是文档中所有标签组成的一个数组变量,包括了文档对象中所有元素(见例1)。

    IE’s document.all collection exposes all document elements.This array provides access to every element in the     

document.
    document.all[]这个数组可以访问文档中所有元素。
 
个人主页 | 引用 | 返回 | 删除
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 9:35:23 | By: jingyuanke(游客) ]
 
比如文档中有一个DIV
    <div id="docid" name="docname"></div>
    你可以通过这个DIV的ID,NAME或INDEX属性访问这个DIV:
    document.all["docid"]
    document.all["docname"]
    document.all.item("docid")
    document.all.item("docname")
    document.all[7]

    document.all.tags("div")则返回文档中所有DIV数组,本例中只有一个DIV,所以用document.all.tags("div")[0]就可以访问了。
 
个人主页 | 引用 | 返回 | 删除
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 9:48:40 | By: jingyuanke(游客) ]
 

JavaScript中的5种事件使用方式解说

为组件提供事件处理入口,可以极大的提高组件的封闭性,同时又能让组件很好的和外界通信。并且这也是我们已经习惯使用的一种开发模式,.NET、DHTML等都提供了一套完整的事件处理模型。下面是关于使用DHTML中事件的一个总结。

DHTML提供了3种事件的使用方式,它们分别是:

1、Inline HTML: <ELEMENT onXXX='handler'></ELEMENT>
这是最简单最常用的事件绑定方式,不过这里onXXX的值为handler是不太确切的说法。其实这个handler的位置可以放置任何合法的JavaScript语句,因为IE在生成DHMTL树时会为当前Element构建一个'匿名'成员方法,onXXX指向这个方法的handler。比如我们写下,<element id='elmt' onXXX='var abc =0; for ( var i=0 ; i < 100 ; i++ ) abc+=i;'></element>,实际上在DHMTL树种存在如下代码结构:

function anonymous()
{
var abc =0; for ( var i=0 ; i < 100 ; i++ ) abc+=i;
}

 

此时anonymous方法中的this就是elmt对象。

2、Event property: object.onXXX = handler
这个使用方法是把函数名(handler)赋予element预定义的事件属性上(onXXX)。这里需要注意两个问题:
一是,我们在使用object.onXXX = handler是需要保证object已经在页面中生成。比如我们为document.body赋予事件处理函数,我们必须保证document.body已经存在,就是说我们不能在<body>之前在的全局语句中使用document.body;
二是,handler必须是函数名,和使用方法1中的handler可以是任何JavaScript语句不同!我们最容易出错的使用是,当我们习惯了在inline html中使用<element id='elmt' onXXX = 'return false'></element>后,如果这样使用elmt.onXXX='return false;'。那么就歇菜了,不会有任何执行效果,当然IE也不报错。正确的使用是:

elmt.onXXX = function() { return false; }

 


3、Named Script: <SCRIPT FOR = object EVENT = onclick>
IE独家支持,没有怎么使用过,不觉得有什么特别的地方哈。如果您知道它的妙处愿闻其详。

DOM提供了两种事件处理使用,它们分别是:

1、attachEvent method:
使用方法:bSuccess = object.attachEvent(sEvent, fpNotify)。解释就抄msdn了
Parameters


sEvent

Required. String that specifies any of the standard DHTML Events.

fpNotify

Required. Pointer that specifies the function to call when sEvent fires.

Return Value
Boolean. Returns one of the following possible values: true

The function was bound successfully to the event.

false

The function was not bound to the event.

DOM提供的这个事件附加方式实际上是一个集合操作,我们可以多次的向同一个事件签名上attach多个事件处理函数,比如: window.attachEvent('onload', handler1);
window.attachEvent('onload', handler2);
window.attachEvent('onload', handler3);
window.attachEvent('onload', handlerN);

 


将会执行这个N个handler,但是不保证执行顺序。这里有个例外,attachEvent在document.body上attach事件'onload'没有效果,但是attch window对象的'onload'是正确的。根据页面初始化顺序来看,及document.body.attachEvent('onload', handler)返回true来看,这因该是IE的一个bug。

注意DHTML的Event Property方式和DOM的attachEvent方式的区别:

Event Property方式,当触发事件时,事件处理函数是一个无参数函数,我们只能通过event这个window的属性来读取和事件相关的信息。attachEvent方式,当事件处理函数被触发时,该函数的第一个参数arguments[0],默认是该窗口上的event。什么意思呢?不明白参看 这里。

2、fireEvent method
请参看: 在什么时候才会用到fireEvent方法呢?

 
个人主页 | 引用 | 返回 | 删除
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 9:52:17 | By: jingyuanke(游客) ]
 

在什么时候才会用到fireEvent方法呢?

在DHTML开发中,微软在其DOM中为每个元素实现了一个fireEvent方法。我们知道HTML的事件onXXX可以由系统(IE环境)来管理和触发,也可以直接执行事件的handler,比如onclick,如果被赋予事件处理函数,我们可以用element.onclick()来执行事件处理函数。那么fireEvent用来干嘛呢?

在MSDN中fireEvent的描述很简单:Fires a specified event on the object.
bFired = object.fireEvent(sEvent [, oEventObject])

并且MSDN给出了一个使用fireEvent的示例:

<HTML>
<HEAD>
<SCRIPT>
function fnFireEvents()
{
div.innerText = "The cursor has moved over me!";
btn.fireEvent( "onclick");
}
</SCRIPT>
</HEAD>
<BODY>
<h1>Using the fireEvent method</h1>
By moving the cursor over the DIV below, the button is clicked.
<DIV ID="div" onmouseover="fnFireEvents();">
Mouse over this!
</DIV>
<BUTTON ID="btn" ONCLICK="this.innerText='I have been clicked!'">Button</BUTTON>
</BODY>
</HTML>

 


这个示例非常的简单,也完全说明了fireEvent的用法。不过这个示例有一点误导我们,从而让我们不容易发现frieEvent更有价值的使用方法。由于button的onclick事件被赋予语句:this.innerText = 'I have been clicked!',这里很容易误导我们,fireEvent产生的是执行了btn.onclick()的效果。嗯,确实是这个效果,但是意义却完全不同,btn.onclick()只是一个函数调用,它的执行必须依赖于用户对其赋值,否则btn.onclick为null,是不能执行btn.onclick()的。而fireEvent('onclick')的效果,"等同于"鼠标在button元素上进行了点击。

由于IE的事件处理是bubble up方式,fireEvent(sEvent)就显得更加的有意义了,如果我们在一个table元素<table>中监听事件,比如onclick,当点击不同的td做出不同的响应时。如果使用程序来模拟,只能使用fireEvent这种方式,示例如下:

<table border="1" onclick="alert(event.srcElement.innerText);">
<tr>
<td id="abc">abc</td>
<td id="def">def</td>
</tr>
</table>
<button onclick="abc.fireEvent('onclick')">
abc </button>
<button onclick="def.fireEvent('onclick')">
def </button>

 

使用abc.onclick()和def.onclick()将得到"Object doesn't support this property or method"异常。

 

abc

def


abc def

知道了fireEvent的用法,那么我们用它来做什么呢?在开发具有复杂事件处理动作组件时。有时我们需要从程序中去触发一个本身因该鼠标或键盘触发的事件,比如在TreeView控件中,我们一般是使用鼠标点击来Expand &Collapse一个结点,如果我们要用程序代码来实现这个操作怎么办呢?当然直接执行事件处理函数是可以的,不过如果事件处理函数依赖于event变量中的状态值,那么就必须使用fireEvent方法。

原来我曾经说过,因该把事件处理的函数封装起来,便于直接调用。比如上面说到的TreeView节点的Expand和Collapse,我在TreeView控件中都是把它们封装成两个函数Expand和Collapse,在节点被点击时,执行:
OpIcon.onclick = function()
{
var objNode = this.Object;
if ( objNode.m_IsExpanded )
objNode.Collapse();
else
objNode.Expaned();
}

这样一来,在程序中控制Expand和Collapse也就是分别执行函数而已。不过后来发现既然DOM中有fireEvent方法,似乎我在 "动态载入数据的无刷新TreeView控件(4)"中的某些想法也不是很必要了

 
个人主页 | 引用 | 返回 | 删除
 
 
 
Re:JavaScript窗口功能指南之创建对话框
[ 2005-10-8 10:05:21 | By: jingyuanke(游客) ]
 

http://www.cnblogs.com/birdshome/ 博客园

上面好多内容摘自这里,水平很高的一个博客