使用Popup窗口创建无限级Web页菜单(3)

简介:
菜单除了要它能显示,还要它能执行动作才是最关键的地方。popup是个子窗口,虽然他没有opener。我们有两种办法来在popup中执行脚本,一是把script代码写到其document中,让它运行,比如:
None.gif     var win = window;
None.gif     var doc = win.document; 
None.gif     var popup = win.createPopup();
None.gif     var popwin = popup.document.parentWindow;
None.gif     var popdoc = popwin.document; 
None.gif    
None.gif    popdoc.write('<script> function showAlert(){alert("a");}<' + '/script><div onclick="showAlert()">click me</div>'); 
None.gif    popup.show(0, 0, 100, 100);
    这样在弹出的popup中就可以点击"click me"出来一个alert msg box。
    另一种方法是使用attachEvent的办法,这样popup可以执行其opener窗口中的脚本,比如:
None.gif    popdoc.write('<div>click me</div>'); 
None.gif     var div = popdoc.getElementsByTagName('DIV')[0];
None.gif    div.attachEvent('onclick', Alert3); None.gif    
None.gif    popup.show(0, 0, 100, 100);
    在opener窗口中的scirpt方法:
None.gif      function Alert3() { alert(3); } 
    在第二个方法里有个undocumented的特性, 使用attachEvent方法attach的事件响应函数在被触发时,第一个参数默认就是其window上的event属性。为什么说是其窗口上呢?因为popup确实是个具有自己的window对象的元素(虽然我们前面说它比较怪异)。这个特性被极好的使用在了菜单条目被点击时的响应处理上,在后面的Menu.Show()和Menu.ShowEx()里都回用到。

    我们在 使用(2)中的最后说过,由于在popup的doucment对象上使用appendChild有UI效果上的问题,所以我们不得不使用innerHTML赋值方式来生成菜单的显示UI HTML代码。这样的代码和我们的JavaScript写的菜单类之间就没有了任何的联系,为了把这个联系重新建立起来,我们使用了一个全局的类似Hashtable的类__MenuCache__来存储菜单逻辑和UI HTML之间的一对一联系,这个方法不是我创造的,它是 Erik Arvidsson实现的 DHTML Menu 4里面的方法,我借用了一下,觉得这个方法还是挺好的。   
None.gif      var __MenuCache__ =
None.gif     {
None.gif         m_Count :        0,
None.gif         m_IdPrefix :    "__MenuObject__",
None.gif         m_ActiveItem :  null,
None.gif
None.gif         NewId :  function()
None.gif         {
None.gif              return  this.m_IdPrefix +  this.m_Count++;
None.gif         },
None.gif
None.gif         Remove :  function(mi)
None.gif         {
None.gif              delete  this[mi.m_Id];
None.gif         }
None.gif     };


    虽然我看了Eric的Menu4的代码,我只能说这个__MenuCache__是里面的亮点,而其他的部分写的真是有些乱,毕竟他那个Menu类前前后后历时两年,其间修复了n多bug。当然我这个Menu的实现自然有些站在巨人肩膀上的味道了emwink.gif

    再说点题外话,Eric的javascript水平是毋庸置疑的,既有webfx.eae.net上丰富的DHTML组件类,还有更震耳发聩的Bindows™。但是更让我觉得难能可贵的是他在webfx上那些详细的教程,我看了他的教程后,一个晚上就做一个Menu的prototype,后来修修补补到现在一个周已经完全实现了DHTML Menu 4菜单部分的全部功能(MenuBotton那部分我没有做,因我目前暂时用不上)。本来我可以简单的把代码一发就完事,可能还更受大家欢迎。但我觉得我在这里详细的介绍这个PopMenu的实现过程和其间遇到的一些问题,会让踏实学习的人收获到更多的东西,同时也督促我自己更加踏实的学习工作。如果能引起讨论氛围,指出我使用的方法中的错误和不足并给予建议,那更是一件让我开心的事emsmile.gif。  


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。  

目录
相关文章
|
存储 IDE 前端开发
SpringBoot2.x系列教程02--新纪元之SpringBoot创建Web项目的常用方式
前言 在上一章节中,壹哥 给大家介绍了SpringBoot的优缺点,并重点介绍了其”约定大于配置“的思想,你现在还能记得吗? 而且上文中,壹哥 说我们创建SpringBoot项目有3种方式,我们已经学习了第一种创建项目的方式了,接下来还有另外两种创建项目的方式,这两种方式该怎么创建项目呢?今天 壹哥 就把剩余的两种方式也一股脑都抖搂给大家吧。 一. 以官网模板方式创建Web项目(了解) 首先 壹哥 给大家介绍第2种创建Web项目的方式,对于这种方式大家仅做了解即可,其原理与第一种以Spring Initializr创建项目的方式一样。 1. 在spring.io官网下载模板构建项目 首先我们
324 0
|
存储 前端开发 JavaScript
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
608 0
|
JSON JavaScript 中间件
【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
199 1
【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
|
NoSQL MongoDB 数据库
MongoDB v4.4.6安装、创建服务及Web客户端访问MongoDB详解
MongoDB v4.4.6安装、创建服务及Web客户端访问MongoDB详解
280 0
MongoDB v4.4.6安装、创建服务及Web客户端访问MongoDB详解
|
数据采集 Go
Go Web编程实战(9)----创建客户端
Go Web编程实战(9)----创建客户端
140 1
|
Java Go
Go Web编程实战(8)----创建HTTP与HTTPS服务器端
Go Web编程实战(8)----创建HTTP与HTTPS服务器端
188 0
Go Web编程实战(8)----创建HTTP与HTTPS服务器端
|
JavaScript
【Node.JS 】创建基本的web服务器
【Node.JS 】创建基本的web服务器
158 0
【Node.JS 】创建基本的web服务器
|
Java Maven
IDEA2022版本创建maven web项目(两种方式)
创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式
699 1
IDEA2022版本创建maven web项目(两种方式)
|
Web App开发 XML 开发框架
WebAPI学习(一)——创建Web API程序
WebAPI学习(一)——创建Web API程序
249 0
|
JavaScript 前端开发
Node.js 创建并封装静态 WEB 服务器
Node.js 创建并封装静态 WEB 服务器
123 0
Node.js 创建并封装静态 WEB 服务器