`
babydeed
  • 浏览: 237972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ext中如何使窗体总在最前面

    博客分类:
  • Ext
阅读更多
在Ext中如何使窗体总在最前面(how to set a window always on top in Ext)
如,有如下窗体
var formWin = new Ext.Window({
    title: 'new window'
    ,width: 200
    ,height: 400
    ,html: 'This will be always on top'
});

现要使得这个窗体总是在其他窗体的前面,而且不影响其他窗体的使用(使用modal:true 选项可创建模态窗,但会冻结整个屏幕)。

国际惯例,先在官方论坛 搜索一下,最快捷、准确的方法是使用google来搜索。果然google没让人失望,第一页里就找到了关键帖

他介绍的方法是修改Ext.WindowGroup 类(位于 widgets/WindowManager.js )的私有方法sortWindows(),改为:

    var sortWindows = function(d1, d2){
        return (!d1.alwaysOnTop && (d2.alwaysOnTop || !d1._lastAccess || d1._lastAccess < d2._lastAccess)) ? -1 : 1;
    };

这样就运行在初始化window时可以使用一个新的选项:alwaysOnTop ,如:
var formWin = new Ext.Window({
    title: 'new window'
    ,width: 200
    ,height: 400
    ,html: 'This will be always on top'
    ,alwaysOnTop: true
});

修改做的修改很少,但要hack源码肯定是最差的备选的方案。

而sortWindows 是个私有方法,js是无法从类外覆盖私有方法的,具体可参考
Tutorial:Application Layout for Beginners

因此尝试剑走偏锋,看看有没其他方案。查看Ext.Window的API ,在事件中的部分发现有两个事件是相关的:

activate : ( Ext.Window this )
Fires after the window has been visually activated via setActive.

deactivate : ( Ext.Window this )
Fires after the window has been visually deactivated via setActive.

一般来说,要使窗体总在最前方,应该是先触发了deactivate事件,因此在这时再主动设置为active,则可使窗体总保持激活状态也即是最前方了。

尝试如下:
formWin.on('deactivate', function(){
    this.setActive(true);
})

发现无效。阅读setActive的源码后知道原来setActive 只是用来设置是否显示窗体阴影是否显示。
Ext.Window 还有一个公共方法可以利用:
toFront() : Ext.Window
Brings this window to the front of any other visible windows

尝试用来代替setActive:
formWin.on('deactivate', function(){
    this.toFront();
})

发现也无效,查看源码发现Ext.Window.toFront() 实际是调用 Ext.WindowGroup.bringToFront(win),而在 Ext.WindowGroup.bringToFront(win) 里会判断 win 是否是当前窗口,如果是就不做任何操作,而在deactivate 里,当前窗口正是formWin,所以不会对他做任何操作。

在仔细跟读源码,原来决定窗体哪个在前面,是使用Ext.Window.setZIndex() 在设置窗体z轴(垂直于电脑屏幕的轴)的zIndex值,越高的则越前。

知道底层实现原理就好办了,只要给formWin设置一个较大的zIndex值则可,尝试如:

formWin.on('deactivate', function(){
    this.setZIndex(9999);
})

点击其他窗体,formWin总是显示在最前方了。

但窗体的数量是不确定的,而Ext用来调整各个窗体的前后顺序是动态的,具体实现源码为:
    // private
    var orderWindows = function(){
        var a = accessList, len = a.length;
        if(len > 0){
            a.sort(sortWindows);
            var seed = a[0].manager.zseed;
            for(var i = 0; i < len; i++){
                var win = a[i];
                if(win && !win.hidden){
                    win.setZIndex(seed + (i*10));
                }
            }
        }
        activateLast();
    };

因此,也要根据当前窗体的数量来动态调整zIndex的值,代码改为:
formWin.on('deactivate', function(){
    var i=1;
    this.manager.each(function(){i++});
    this.setZIndex(this.manager.zseed + (i*10));
})

至此,可以说是已经完整实现了需求。

但有时窗体是直接new出来,没有赋值给临时变量,需要能在构造函数中设置。幸好Ext的接口丰富,有提供一个plugin的选项来提供扩展(如何写一个Ext的plugin: Plugins: Writing a Plugin),最终实现代码为:

var formWin = new Ext.Window({
    title: 'new window'
    ,width: 200
    ,height: 400
    ,html: 'This will be alwasy on top'
    ,plugins: new function(){
        this.init = function(win){
             win.on('deactivate', function(){
                    var i=1;
                    this.manager.each(function(){i++});
                    this.setZIndex(this.manager.zseed + (i*10));
                })
        }
    }
});


如果要实现重用,最好把plugin实现代码抽取为一个独立的plugin,如:
Ext.ux.WindowAlwaysOnTop = function(){
    this.init = function(win){
         win.on('deactivate', function(){
            var i=1;
            this.manager.each(function(){i++});
            this.setZIndex(this.manager.zseed + (i*10));
         })
    }
}

以后使用则很方便了:
var formWin = new Ext.Window({
    title: 'new window'
    ,width: 200
    ,height: 400
    ,html: 'This will be always on top'
    ,plugin: new Ext.ux.WindowAlwaysOnTop
});

效果如图
new window active:
new window deactive:

转自:

http://hi.baidu.com/rainchen/blog/item/b8fbd1438df5b71472f05d57.html

分享到:
评论
1 楼 tipx 2010-07-02  
我一开始也是尝试用activate/deactivate事件、在某种条件下动态将window置前,都失败了。
最后发现直接更改window的manage,即设置新的WindowGroup,并将该group的zseed设置大些,就可以了,不会受所属默认WindowGroupMgr的所有window的影响,而且不需要更改任何源码、也不需要编写plugin
//新建window组,避免被其它window影响显示在最前的效果
var tipsGroupMgr = new Ext.WindowGroup();
tipsGroupMgr.zseed=99999; //将窗口前置

var win = new Ext.Window({
    //其它属性略
     manager: tipsGroupMgr
});

相关推荐

    ext仿windows操作系统窗体嵌入桌面问题

    标题中的“ext仿windows操作系统窗体嵌入桌面问题”指的是使用EXTJS框架开发的应用程序,尝试模拟Windows操作系统的界面风格,将窗口(窗体)嵌入到桌面环境中。EXTJS是一个基于JavaScript的富客户端框架,它允许...

    EXT JS中文API+中文教程+中文资料+源码

    总的来说,这个压缩包集合为EXT JS的学习者提供了全面的资源,包括API文档、教程、实例和源码,覆盖了从入门到进阶的各个阶段,是EXT JS开发者的重要参考资料。无论是初学者还是经验丰富的开发者,都能从中受益匪浅...

    Ext3.2中文API

    Ext中文API Ext3.2中文API ExtAPI Ext中文Ext中文API Ext3.2中文API ExtAPI Ext中文Ext中文API Ext3.2中文API ExtAPI Ext中文

    ext中文教程 ext API

    ext中文教程 ext API ext中文教程 ext API

    ext教程、ext核心API 、ext中文教程

    在"EXT教程"中,你将学习到EXT的基础知识,包括如何初始化应用、创建组件、布局管理以及如何与其他JavaScript库或后端服务集成。EXT的组件化思想是其核心,通过各种组件如表格(Grid)、面板(Panel)、窗口(Window...

    ext js 中文手册

    Ajax在Ext JS中是指通过异步JavaScript和XML技术实现与服务器的通信,从而使页面无需刷新即可更新数据或内容。Ext JS通过其Ajax组件和方法,支持各种请求和响应处理机制,大大提高了Web应用的交互性和用户体验。 ...

    ext PPT,EXT 教程,EXT 中文帮助手册,EXT 中文手册,ext_教程(入门到精通),Ext技术程序文档大全.

    在提供的资源中,我们可以看到一系列关于EXT的学习资料,涵盖了从入门到精通的各个阶段: 1. **EXT 中文手册**:这是EXT的官方中文文档,包含了EXT框架的基本概念、API参考、示例代码以及最佳实践。通过阅读这本...

    Ext2.0.2经典的一个JS组件带EXT中文手册.rar

    - `INCLUDE_ORDER.txt`:指示了在网页中引入ExtJS相关文件的正确顺序,确保库能正常工作。 4. **目录**: - `docs`:可能包含更详细的API文档或者示例,帮助开发者深入学习ExtJS的每个组件和方法。 - `...

    在windows下使用Ext2Fsd访问EXT4分区

    在Windows操作系统中,由于默认不支持Linux文件系统如EXT4,因此无法直接读取或写入EXT4格式的分区。但有一些第三方工具可以帮助我们解决这个问题,其中之一就是Ext2Fsd。Ext2Fsd是一个免费的开源软件,专门设计用于...

    ext4.0中文文档

    在EXT4中,文件的重命名操作变得非常快速,因为它们现在在内存中完成,避免了对磁盘的大量读写操作。 4. **延迟分配** 这一特性允许EXT4在写入数据时并不立即分配磁盘空间,而是等到数据实际写入时再分配,这有助...

    ext 中文源代码

    在提供的“ext2中文文档新春版”中,很可能是EXT2版本的相关文档,EXT2是EXT的一个早期版本,可能包含了详细的API文档、教程和示例代码,帮助开发者理解EXT的基本用法和内部机制。通过阅读这些文档,开发者可以了解...

    EXT中文API , 中文

    EXT中文API帮助,没什么可说的。 EXT中文API帮助,没什么可说的。 EXT中文API帮助,没什么可说的。 EXT中文API帮助,没什么可说的。

    EXT中文教程

    Element是Ext框架中最基础的部分,它封装了对DOM的操作,提供了对DOM节点进行查询、样式修改、事件绑定等能力,使得JavaScript操作DOM变得更加简洁和高效。 - **获取多个DOM的节点** Ext通过Element的静态方法`...

    JSP中使用EXT实现grid table

    总的来说,EXT Grid是JSP开发中实现Ajax数据表格的强大工具,它提供了一系列高级特性和灵活的配置选项,使开发者能够快速构建高效且用户友好的数据展示界面。通过熟练掌握EXT Grid的使用,你可以提高Web应用的交互性...

    Ext2.0 中文文档

    适配器(Adapters)在EXT中扮演着关键角色,它们帮助EXT与不同版本的jQuery或其他JavaScript库共存,提供兼容性解决方案。 EXT2.0的学习路径建议从基本的Element操作和事件处理开始,逐步掌握Widgets的使用,然后...

    ext中文帮助文档最终版

    2. **布局管理**:EXT 2.0引入了多种布局模式,如"fit"、"border"、"form"和"table",使得在容器中动态调整子组件的大小和位置变得简单。 3. **数据绑定**:EXT支持数据绑定,这意味着你可以将组件与数据源(如JSON...

    Ext4中文API

    Ext4是Linux操作系统中最常用的文件系统之一,它在性能、可靠性和可扩展性方面有着显著的优势。这篇中文API文档是由国内技术爱好者精心翻译的,旨在为国内开发者提供更易理解和使用的资源,帮助他们更好地驾驭Ext4...

    EXT 中文手册EXT 中文手册

    EXT 中文手册EXT 中文手册EXT 中文手册

    EXT帮助文档(中文EXT3.0 API,中文EXT2.2 API)

    通过Ext2.2API中文版(最终完成版).CHM,开发者可以了解EXT 2.2的主要特性并学习如何在项目中应用。 EXTJs资料.chm可能包含了EXT库的综合学习资料,比如教程、示例代码、最佳实践等,这些内容对于初学者和有经验的...

    ext 中文帮助文档

    ext 中文帮助文档,最新的ext中文帮助文档, 是我们公司的开发员工,一起经过苦熬的结果, 经过我们公司项目经理的决定,还是让它发布出来, 让爱ext 的人少走弯路, 随便拿点积分,呵呵!!

Global site tag (gtag.js) - Google Analytics