这几天一直纠结Extjs desktop怎么动态读取数据,用Ext.net已经实现但是不灵活。Ext.net做出来的桌面在窗口关闭后只是隐藏该窗口,并没有释放,对于我这种js菜鸟来说,改那一坨代码要人命啊。本来想用extjs4.2做桌面,不过下载下来发现在IE8下有个bug,一时也不知道该如何解决,于是还是用2.0吧。。。。。

经过网上搜索,找到了一篇不错的文章http://cat-rat.iteye.com/blog/1462567

这篇文章详细的解释了如何动态实现,不过文章里面用的是测试数据,当我换成用ajax请求返回json数据时遇到了问题。

用一贯alert()的手段,测出来了extjs先执行了sample.js这个文件里面的内容最后才执行ajax。

于是在deskop.html这个页面里我是这样写的

Ext.Ajax.request({
                url: 'AjaxRequest/GetWindow.aspx',
                params: {},
                success: function(resp, opts) {

var data = Ext.util.JSON.decode(resp.responseText);//返回的json字符串经过解析成json数据
                    var menuData = Ext.data.Record.create([
       { name: 'text' },
       { name: 'url' },
       { name: 'filterUrl' },
       { name: 'leaf' },
       { name: 'menuId' },
       { name: 'appId' },
       { name: 'children' }
  ]);
                    var myReader = new Ext.data.JsonReader({}, menuData);
                    var store = new Ext.data.Store({
                        proxy: new Ext.data.MemoryProxy(data),

reader: myReader
                    });

//在这个地方将sample.js内的代码拷贝过来

},

failure: function(resp, opts) {
                        Ext.Msg.alert('警告', "请求的页面不存在,请联系管理员");
                    }
                });

先用ajax请求,请求成功之后再开始执行samp.js的内容:

AjaxRequest/GetWindow.aspx这个页面的代码:

//按照这种格式输出json字符串

string s = @"[ { 'text': '测试', 'url': 'null', 'filterUrl': '', 'leaf': false, 'menuId': '100489', 
       'appId': 0, 'children': [{ 'text': '程序组定义', 'url': '../Default.aspx', 'filterUrl': 'null', 'leaf': true, 'menuId': '100531', 'appId': 0}]}
,{ 'text': '测试', 'url': 'null', 'filterUrl': '', 'leaf': false, 'menuId': '100489', 
        'appId': 0, 'children': [{ 'text': '程序组定义', 'url': '../Default.aspx', 'filterUrl': 'null', 'leaf': true, 'menuId': '100531', 'appId': 0}]}
]";
        Response.Write(s);
        Response.End();

如图:

然后增加了桌面右键菜单:

在desktop.js中增加如下代码即能实现

this.closeWindows = function() {
                    windows.each(function(win) {
                        win.close();
                    },
        this);
                }

this.minimizeWindows = function() {
                    windows.each(function(win) {
                        if (win.minimizable) {
                            minimizeWin(win);
                        }
                    },
        this);
                }

this.contextMenu = new Ext.menu.Menu({
                    items: [{
                        text: '关闭所有',
                        handler: this.closeWindows,

scope: this
                    },
        '-', {
            text: '全部最小化',
            handler: this.minimizeWindows,

scope: this
        },
          '-', {
              text: '刷新页',
              handler: function() {
                  window.location.href = window.location.href;
              },
              scope: this
          },
        '-', {
            text: '系统设置',
            // handler: this.ShowWallpaper_Win,
            handler: function() {
                var win = Ext.get("0000000001");
                if (!win) {

win = new Ext.Window({
                        id: '0000000001',
                        //contentEl: "win", //重新生成窗体时,不可重复定义
                        maximizable: true,
                        closeAction: 'close',
                        minimizable: false,
                        iconCls: 'bogus',
                        width: 700,
                        height: 450,
                        title: "系统设置",
                        modal: false,
                        contentEl: Ext.DomHelper.append(document.body, {
                            tag: 'iframe',
                            style: "border 0px none;scrollbar:true",
                            src: '../UserSet/UserSet.aspx',
                            allowtransparency: true,
                            frameborder: 0,
                            height: "100%",
                            width: "100%"
                        })
                    });

win.show();
                }
            },
            scope: this
}]
                });
                desktopEl.on('contextmenu',
    function(e) {
        e.stopEvent();
        this.contextMenu.showAt(e.getXY());
    },
    this);

做完之后客户需要对桌面图标的大小、桌面图标下文字颜色、背景图片等进行改变,我又用jquery实现了这些功能。

网上搜索有人是这样http://blog.csdn.net/junmoxie/article/details/8021987实现动态读取url弹出窗口的,本人用这种iframe试过发现有些bug,具体怎么回事不太清楚,不过找到了解决办法。

//原来是这样写的
   createMyWindow: function (win_data) { var desktop = this.app.getDesktop(); var win = desktop.getWindow(win_data.id); if (!win) { win = desktop.createWindow({ id: win_data.id, title: win_data.title, width: 640, height: 480, html: '<iframe style="position:relative;background-color:transparent;" allowtransparency="true" width="100%" height="100%" frameborder="0" src="' + win_data.url + '"></iframe>', iconCls: 'bogus', animCollapse: false, constrainHeader: true }); } win.show(); return win; },

//将html: html: '<iframe style="position:relative;background-color:transparent;" allowtransparency="true" width="100%" height="100%"  frameborder="0" src="' + win_data.url + '"></iframe>',

改成:  contentEl: Ext.DomHelper.append(document.body, {
                                                    tag: 'iframe',
                                                    style: "border 0px none;scrollbar:true",
                                                    src: '../UserSet/UserSet.aspx',
                                                    allowtransparency: true,
                                                    frameborder: 0,
                                                    height: "100%",
                                                    width: "100%"
                                                })

这样那个bug就没了,不知道为什么。不过经过IE自带的调试工具发现,如果直接用没改动的那段代码创建的窗口,在关闭后还会请求原来的页面,过一会就报"没有权限"错误,如果关了之后立马打开不会有问题,就是只关不开后就报错。将代码改动后这个bug就没了。

 ↓↓↓扫描下面的二维码,关注我的公众号

Extjs2.0 desktop 动态创建桌面图标和开始菜单的更多相关文章

  1. wpf 全局异常捕捉+错误日志记录+自动创建桌面图标

    /// /// 创建桌面图标 /// public static void CreateShortcutOnDesktop(string LnkName) { String shortcutPath ...

  2. robot创建桌面图标(转载)

    桌面ride图标,安装之后会自动创建(偶尔也会创建失败),创建桌面图标方法如下: 1. 新建快捷方式 在桌面右击鼠标,弹出的菜单选择 新建-快捷方式 ,然后在"请键入对象"的位置输 ...

  3. 空闲时间研究一个小功能:winform桌面程序如何实现动态更换桌面图标

    今天休息在家,由于天气热再加上疫情原因,就在家里呆着,空闲时想着,在很早以前(约3年前),产品人员跟我提了一个需求,那就是winform桌面程序的图标能否根据节日动态更换,这种需求在移动APP上还是比 ...

  4. 在fedora20下面手动为自己的安装程序创建桌面图标

    (博客园-番茄酱原创) 在/usr/share/applications/下面创建destktop文件,用于产生桌面图标 创建文件:touch android-eclipse.desktop 编辑文件 ...

  5. 【MFC】动态创建CMFCToolbar图标不显示问题

    最近遇到一个问题,需要动态的从xml文件读取一系列图标文件,加载到一个toolbar中,由于使用的是vs2008 with sp1 feature pack,自然想到用CMFCToolbar来做,思路 ...

  6. LINUX下给软件创建桌面图标

    转自:http://www.cnblogs.com/Rapheal/p/3610411.html?utm_source=tuicool&utm_medium=referral 最近在折腾lin ...

  7. Android 动态更换桌面图标

    每当双 11.12 来临之际,Android 手机 Launcher 中的淘宝.天猫图标就会变成双 11.12 主题的图标.实现了动态切换图标.名称 MainActivity package com. ...

  8. Ubuntu创建桌面图标

    以火狐为例 创建"~/.local/share/applications/firefox_dev.desktop"文件, 文件内容为: [Desktop Entry] Name=F ...

  9. deepin ubuntu等创建桌面快捷方式

    Linux网上下载软件一般只会有.sh结尾执行程序.并不会像商店下载一样自动创建桌面图标.此时需要自行进行编辑. #创建一个桌面图标后缀名为.desktop touch myDesktop.deskt ...

随机推荐

  1. Linux主分区,扩展分区,逻辑分区的联系和区别

    主分区,也称为主磁盘分区,和扩展分区.逻辑分区一样,是一种分区类型.主分区中不能再划分其他类型的分区,因此每个主分区都相当于一个逻辑磁盘(在这一点上主分区和逻辑分区很相似,但主分区是直接在硬盘上划分的 ...

  2. Android 读写文件

    Android 读写文件 Android使用一个非常类似与其他平台上的基于磁盘的文件系统. 这节课讲述如何利用File APIs在Android文件系统中读写文件. File 对象非常适合于流式顺序数 ...

  3. canvas粒子系统的构建

    前面的话 本文将从最基本的imageData对象的理论知识说开去,详细介绍canvas粒子系统的构建 效果演示 下面是实例效果演示,博文结尾有全部源码 imageData 关于图像数据imageDat ...

  4. hdu 5040 Instrusive

    Instrusive Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tota ...

  5. [2014-08-17]Mac OSX 截图快捷键

    系统:OSX 10.9.4 内容来自网络,存于此以便查阅 基本操作 全屏截图:Command-Shift-3 指定区域截图:Command-Shift-4 指定窗口截图:Commnad-Shift-4 ...

  6. mysql互换表中两列数据

    在开发过程中,有时由于业务等需要把一个表中的两列数据进行交换. 解决方案 使用update命令,这完全得益于MySQL SQL命令功能的强大支持. 表格中原来数据类似如下: select * from ...

  7. vue-router的两种模式的区别

    众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. ### hash模式 hash模式背后的原理是`onhashchange`事件,可以在`window ...

  8. C#设计模式(4)-抽象工厂模式

    引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...

  9. poj 3592 缩点+SPFA

    题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送.求从0,0点开始出发能获得最大权值. 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0 ...

  10. 操作系统:ucore的部分Bug&挑战练习

    ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...