`

跨Frame下拉菜单

阅读更多

原:  [导入]层遮挡的问题  
使用层或者其他技术所实现的JS菜单不能解决的问题就是这些菜单不能跨帧,也就是说在Frame之间的时候无可奈何,所幸的是IE5+提供了createPopup这个函数,可以提供窗口的创建,使用createPopup需要注意以下几个问题:
1、函数没有任何参数
2、CreatePopup函数返回的值是新窗口的句柄,这个窗口和普通的窗口一样,所有该有的东西都有。
3、新窗口的parent属性可以对父级窗口(调用createPopup函数的窗口进行访问)
4、一个窗口只能创建一个popup窗口,新调用createPopup将会吧以前的窗口关闭。
5、新窗口的内容初始的时候是空的,没有任何内容,使用document.write和document.body.innerHTML设置值
6、窗口显示的时候调用popwindow.show函数,调用契约为 show(left,top, width, height, document.body);最后一个参数指明位置属性相对的对象
7、窗口隐藏直接调用hide函数。
8、在父级窗口中点击鼠标将会自动将popwindow隐藏。
9、销毁父亲窗口不一定销毁其创建的popwindow,前提是保存窗口句柄的对象是否被销毁。
10、使用alt-tab转换窗口的时候,有时这些新窗口会悬浮在桌面顶层,不会随IE窗口转到后台而隐藏(IE6、IE7都是)
11、新窗口的对象不能使用父窗口的CSS风格,需要手工复写
12、新窗口中的链接(Anchors)需要注意点击之后链接显示的窗口是当前的窗口,一般无效。
13、新窗口中的JavaScript出现错误的时候并不会在当前的IE状态栏中提示!
14、新窗口的CSS风格不支持expression,晕!
15、显示窗口的时候(调用show函数)必须指定窗口的位置和大小,尤其是大小,新窗口可不能自动进行缩放!

实现跨帧菜单首先确定显示方式,每一级的菜单都是显示在一个Popwindow中,如前所述,在一个窗口中只能有一个popwindow,如图显示二级菜单就无法显示了,如何解决这个问题呢?
刚才我们提到,popwindow对象本身就是一个完整的窗口对象,要解决这个问题的最直接的办法就是,下级菜单的生成有父亲菜单所在的窗口(不管是主窗口还是popwindow)调用createPopup生成,这样,各级菜单都可以拥有自己的popwindow,而且可以自动的在同级菜单中进行切换,具体的脚本如下

var ele=control==null?event.srcElement:$(control);
/*...*/
var popw=ele.document.parentWindow.window.createPopup();
/*...*/

层次结构可以构造菜单的基本样式,刚才提到,popwindow不支持CSS风格,也就是说需要手工将CSS风格写到popwindow中,写CSS风格可以使用document.write方式或者直接构造styleSheet对象然后插入rule的方式(注意,直接使用document.body.innerHTML写的style标签好像没有生效),我采用前者,主要原因是,我在主窗口中配置菜单的显示风格,而后将这些显示css风格的文本信息直接保存下来,然后对每个新窗口进行写操作,这样就可以保持每级菜单的CSS风格完全一致。
读取主窗口CSS的代码如下

FrameMenuConfig.CssText="";
    for(var n=0;FrameMenuConfig.CssPrefix!=null && FrameMenuConfig.CssPrefix.length>0 && n<document.styleSheets.length;n++)
    {
      var sts=document.styleSheets[n];
      for(var x=0;x<sts.rules.length;x++)
      {
        var rr=sts.rules[x];
        if(rr.selectorText.indexOf(FrameMenuConfig.CssPrefix)>=0)
        {
          FrameMenuConfig.CssText+=rr.selectorText+"{"+rr.style.cssText+"}";
        }
      }
    }

这里使用的是匹配FrameMenuConfig.CssPrefix的CSS风格才写入到新的窗口中。

然后涉及到菜单的数据结构的定义,这个定义比较简单,就不扯了,用膝盖也能想出来。我这边处理的时候为了防止函数被重复定义,使用了简单的类静态函数的方式进行定义。

到现在为止,我们可以画出一层一层的菜单,在每层的菜单项上挂接onmouseover处理函数就可以自动弹出下级菜单,一切看起来已经完成了。

呵呵,好像还有点东西,菜单的链接有问题,如何解决在新窗口中的Anchor链接指向的页面在我们指定的框架中显示?首先还是要强调,每个popupwindow都是一个window对象,使用parent可以取得上级的对象,我的处理方法是在主窗口中定义了一个goto(url,target)的函数,这个函数负责在主窗口中将URL正确的进行跳转,带出来的问题是,怎么让popwindw正确的调用这个函数,第一层菜单使用parent.goto,第二层菜单使用parent.parent.goto,第三层使用.....Embarassed

最后一个就是解决alt-tab的问题,这个问题说起来也简单,当alt-tab处理的时候隐藏IE窗口会触发document.onfocusout事件,在这个事件中对所有的popwindow 进行关闭即可,实际测试的时候,却发现如果不对IE窗口的内容进行点击操作(鼠标划过不算),不会使得document取得焦点,也就无法触发onfocusout事件,简单的做法是生成菜单之后调用一下document.focus()函数,这个函数可能会将焦点移动,所以不是很好,但是找不到解决的办法了 

没啥藏着掖着的,源代码下载test.rar (7.97 kb)

以下是测试代码,包含鼠标悬停、自动创建和右键菜单,详细请参考压缩包中的东西


<style type="text/css">
  #fm_MainContainer
  {
    width:100%;
    height:20px;
    border:solid menu 1px;
    background-color:ghostwhite;
    padding:3px;
    font-size:10pt;
    color:menu;
  }
  #fm_MainContainer a
  {
    padding-left:15px;
    padding-right:15px;
    border-left:solid 2px #104E8B;
    border-right:solid 1px #104E8B;
    text-decoration=none;
    color:blue;
    font-size:10pt;
    font-weight:bold;
    background-color:;
  }
  #fm_MainContainer a:hover
  {
    text-decoration=underline;
    color:red;
    background-color:yellow;
  }
  #fm_Container
  {
    background-color:#E8E8E8;
    height:19px;    
    cursor:hand;
    width:150;
    padding-right:3px;
    border-bottom:solid 1px menu;
    border-left:solid 5px #B0C4DE;    
  }
  #fm_Container a
  {
    padding-left:15px;
    padding-right:15px;
    font-size:10pt;
    text-decoration=none;
    color:blue;
    font-weight:normal;    
  }
  #fm_Container a:hover
  {
    text-decoration=underline;
    color:red;
    background: url(goto.png) no-repeat;
  }
</style>
<script type="text/javascript" src="../framemenu.js"></script>
<script type="text/javascript">
  //系统生成的菜单如果包含有下级菜单在菜单项的左边显示的图片
  FrameMenuConfig.FolderImage="leftbtn.png";
  //系统菜单生成的结构为<div ><a>...</a></div>,此处设置div的显示风格,a的显示风格请附带在div中设置
  FrameMenuConfig.CssPrefix="#fm_Container";
  //insert函数直接插入一格记录,格式为 父亲代码、节点代码、节点显示文本、节点URL、节点的目标框架,目标框架支持_self和_blank.
  FrameMenu.insert(null,"a","滚动规划");
  //add2函数插入一个菜单,返回这个菜单的父亲节点的实例,格式为 节点显示文本、节点URL、节点的目标框架,目标框架支持_self和_blank.节点的ID自动生成
  FrameMenu.insert(null,"b","立项管理").add2("立项1").add2("立项2");
  //add函数插入一个菜单,返回这个新的菜单的实例,格式为 节点显示文本、节点URL、节点的目标框架,目标框架支持_self和_blank.节点的ID自动生成
  FrameMenu.insert(null,"c","工程实施").add("工程实施1").add("工程实施1_1");
  FrameMenu.insert(null,"d","验收管理").add2("测试用例").add2("测试用例");
  FrameMenu.insert(null,null,"系统菜单").add2("用户管理").add2("测试用例").add2("测试用例").add("角色权限").add2("角色授权").add2("用户授权").add2("资源授权");
  FrameMenu.insert(null,null,"帮助系统").add2("关于本系统").add2("退出系统");
  FrameMenu.insert("a","a1","本地文件","localfile.htm","body");
  FrameMenu.insert("a","a12","新浪网(弹出窗口)","http://wwww.sina.com","_blank");
  FrameMenu.insert("a","a13","多级菜单");
  FrameMenu.insert("a13","a13_1","新浪网(本窗口)","http://www.sina.com","_self");
  FrameMenu.insert("a13","a13_2","新浪网(本窗口)","http://www.sina.com");
  FrameMenu.insert("a13","a13_3","新浪网(Body)","http://www.sina.com","body");
</script>
<body topmargin="0" leftmargin="0" oncontextmenu="FrameMenuConfig.showMenu();return false;">
  这个是TopFrame,Name=TopFrame
  <div id="fm_MainContainer">系统菜单是安排在这里滴,嘻嘻</div>
  <br/><button onmouseover="FrameMenuConfig.showMenu()">鼠标悬停方式显示完整菜单</button>
<script defer>
  FrameMenuConfig.createFrameMenu("fm_MainContainer",false);
</script>
</body>
分享到:
评论
4 楼 rodneytt 2010-08-27  
好东西,多谢!
3 楼 wital 2009-08-26  
FF下还是无效啊~
2 楼 jauney 2009-07-14  
:):) 不好意思,找到了!
1 楼 jauney 2009-07-13  
老大  右键菜单是哪个函数,怎么屏蔽这个功能呀?

相关推荐

    swift-自定义下拉菜单创建下拉菜单对象即刻使用

    在Swift编程中,自定义下拉菜单是一种常见的用户界面元素,它可以为用户提供便捷的操作选择,增强应用的交互性。本文将深入探讨如何在Swift中创建一个自定义的下拉菜单对象,并立即投入使用,同时,我们将不依赖任何...

    swift-点击出现的下拉菜单简单设置数据源就可以实现效果

    在本篇文章中,我们将深入探讨如何使用Swift来创建一个点击后显示下拉菜单的控件,并通过简单设置数据源来实现这一效果。 首先,我们要了解Swift中的下拉菜单其实是一种自定义视图,通常基于UIView或者...

    ios-下拉菜单的选择.zip

    通过修改下拉菜单的frame或alpha属性,可以实现动画效果。 - 如果使用UITableView作为下拉菜单,需要在用户选择项后隐藏它,可以监听UITableView的didSelectRowAt delegate方法。 4. **事件处理**: - `@IBAction...

    AS3+xml下拉菜单_下拉弹出框菜单

    在本文中,我们将深入探讨AS3.0与XML结合实现的下拉菜单和弹出框菜单的原理、设计以及实际应用。AS3.0(ActionScript 3.0)是Adobe Flash开发中的主要编程语言,它提供了强大的功能和高效的性能。XML(eXtensible ...

    ios-下拉菜单.zip

    在iOS开发中,下拉菜单(Dropdown Menu)是一种常见的用户界面元素,用于提供多项选择,通常出现在屏幕顶部或底部,用户只需轻触并下滑即可显示菜单选项。在本例"ios-下拉菜单.zip"中,我们可以看到一个简单的下拉...

    frameset和js下拉菜单

    在本篇文章中,我们将深入探讨frameset的概念、用法以及与JavaScript下拉菜单的结合应用。 **frameset详解** frameset是HTML4中的一个元素,但在HTML5中已被废弃,取而代之的是更灵活的`&lt;iframe&gt;`标签。然而,在...

    ios-仿QQ安全中心下拉菜单.zip

    在iOS开发中,创建自定义下拉菜单是一项常见的任务,特别是在设计类似QQ安全中心这样的应用时,为了提供用户友好的交互体验,这类菜单通常用于展示多种功能选项。本项目名为"ios-仿QQ安全中心下拉菜单.zip",显然...

    仿Ios下拉菜单

    - 实现展开和收起的动画效果,可以使用`UIView.animateWithDuration`方法,改变下拉菜单的frame或透明度。 - 考虑过渡动画的平滑性和速度,确保用户体验自然流畅。 5. **事件处理与交互** - 当用户选择一个选项...

    网页跨frameSet框架菜单

    总的来说,"网页跨frameSet框架菜单"涉及到的是如何在多框架环境下实现交互性和一致性,确保下拉菜单的选择能够在整个页面范围内产生影响,而不受框架的限制。通过合理运用JavaScript和CSS,我们可以克服这一挑战,...

    下拉菜单ios版本

    在iOS开发中,下拉菜单(ComboBox)是一种常见的交互元素,它允许用户通过点击一个按钮或文本框来显示一个可选列表,用户可以从这个列表中选择一个选项。这种设计模式通常用于节省屏幕空间,尤其是在移动设备上,...

    如何用java实现下拉菜单

    在探讨如何用Java实现下拉菜单的过程中,我们主要聚焦于使用Java AWT(Abstract Window Toolkit)和Swing组件来创建动态、交互式的下拉菜单。虽然提供的代码片段中使用了Applet的方式,但在现代Java开发中,更推荐...

    IOS 很好的弹出下拉菜单效果

    在iOS开发中,创建出色的用户体验是至关重要的,而弹出式下拉菜单是实现这一目标的一种常见且实用的方法。本文将深入探讨如何在iOS应用中实现一个很好的弹出下拉菜单效果,以此来提升用户的交互体验。 首先,我们...

    ios自定义下拉菜单Demo

    ios自定义下拉菜单Demo,非常简单的例子,直接使用就可以的。 if (showList) {//如果下拉框已显示,什么都不做 return; }else {//如果下拉框尚未显示,则进行显示 CGRect sf = self.frame; sf.size.height = ...

    Android之抽屉效果的下拉菜单(上下伸缩和展开)

    在Android应用开发中,抽屉效果的下拉菜单是一种常见的交互设计,通常用于导航或显示更多的功能选项。这种效果能够给用户带来丰富的视觉体验和便捷的操作方式。本篇将详细介绍如何在Android中实现一个可以上下伸缩和...

    ios-segment,下拉菜单结合版.zip

    在这种特殊的实现中,"ios-segment,下拉菜单结合版"是将UISegmentedControl与下拉菜单(通常是UITableView或UICollectionView)相结合,提供更丰富的交互体验。 这种设计模式常用于空间有限但需要展示多级或扩展...

    TableView显示/关闭下拉菜单

    这个方法可以改变下拉菜单的frame,使其在单元格下方出现或消失。同时,可能需要处理动画效果以提供更好的用户体验。 ```swift extension CustomTableViewCell { func toggleMenu() { if menuIsHidden { // 假设...

    解决soaoffice阻挡web下拉菜单

    本问题涉及的核心是“SOAOffice”与Web下拉菜单的交互问题。标题和描述中提到的问题是:当用户尝试在含有SOAOffice控件的页面上打开下拉菜单时,菜单项会出现在控件区域下方,而不是预期的上方。这显然是一个用户...

    ios-快速集成下拉式菜单.zip

    首先,我们要介绍的核心组件是`WJDownMenu`,这是一个第三方库,专门为iOS应用提供了易于使用和高度可定制的下拉菜单解决方案。这个库通常以CocoaPods或Carthage的形式被引入到项目中,这样可以方便地管理和更新依赖...

    java下拉菜单源码

    在Java编程中,创建下拉菜单主要涉及Swing库中的组件和事件处理。下拉菜单通常由JMenuBar、JMenu和JMenuItem等类构成。下面将详细讲解如何使用这些组件以及事件监听来实现一个简单的Java下拉菜单。 首先,我们需要...

Global site tag (gtag.js) - Google Analytics