刘继才

导航

 

EasyUI 兼容 IE6 方法总结

1.     背景

1.1 项目介绍

安徽XXXXXX服务平台从 7 月低开始框架搭建,前端UI框架确定使用目前功能比较完善的Jquery EasyUI(没有考虑到客户方目前使用的浏览器大部分都是IE6,项目设计初期的不严谨)。11 初基本功能开发完成,期间一直致力于功能的实现和数据的一致性的核查,并没有太多关注浏览器的兼容性和性能问题。经过在客户现场几次演示的结果,暴露出严重的性能问题和兼容性问题,在IE6 下,系统基本不能运行。于是开始着手调整这些问题。

1.2 框架介绍

优点:JQuery EasyUI 是目前功能比较齐全的一套 UI 框架,为我们提供了大多数UI控件的使用,如:accordion,combobox,menu,dialog,tabs,tree,validatebox,window等,方便开发人员使用,提高开发效率,正是基于这些考虑,项目设计的时候决定使用该框架。

缺点:界面兼容程度不够,不过大部分都发生在IE6下,在 IE7+ 、FF等浏览器中显示正常。

2.     详细分析

2.1 页面重复加载问题

1) 问题现象

点击左侧的菜单,右侧页面被加载了两次。

 

2) 问题分析

1修改前部分代码

$(document).ready(function(){    

       $('#header').panel({href: ctx +'/view/common/header.jsp',onLoad:function(){

              $("div.topMenu li a").click(function(){                                  

                     $(this).addClass("topMenu-item-current");

                     $(this).parent().siblings().children().removeClass("topMenu-item-current");

                     if(this.id == "js") {

                            $('#main').panel("refresh",ctx +"/view/busi/busi_index.jsp");

                            addLeftClick();

                     }else if(this.id == "cl") {

                            …………..

                     }

              });

       }});

});

function addLeftClick(){

       $('#main').panel({  

        onLoad:function(){  

              $(".leftMenu li a").click(function(){

                     $(this).addClass("selected");

                     $(this).parent().siblings().children().removeClass("selected");   

              });

              }  

       });

};

2修改后部分代码

$(document).ready(function(){    

              $('#header').panel({href: ctx +'/view/common/header.jsp',onLoad:function(){

                     $("div.topMenu li a").click(function(){                           

                            $(this).addClass("topMenu-item-current");

                            $(this).parent().siblings().children().removeClass("topMenu-item-current");

                           

                            if(this.id == "js") {

                                   addLeftClick(ctx +"/view/busi/busi_index.jsp");

                            }else if(this.id == "cl") {

                                   …………….

                            }

                     });

                    

              }});

       });

 

       function addLeftClick(url){

              $('#main').panel({  

               onLoad:function(){  

                     $(".leftMenu li a").click(function(){

                            $(this).addClass("selected");

                            $(this).parent().siblings().children().removeClass("selected");

                     });

                     }  

              }).panel("refresh",url);

       };

 

代码实现的功能是点击主菜单的时候,刷新下面的 panel 控件,加载新页面,并且默认选择左侧菜单的第一个。

修改前的代码是先刷新页面,再添加 onLoad 监听事件,导致panel 刷新两次,页面重复加载,修改后先添加 onLoad 监听事件,再加载页面。

2.2 加载速度慢的问题

1) 问题现象

在 IE6 下,点击左侧的菜单,要5s 左右才开始刷新右侧页面,出现右边长时间空白。

 

2) 问题分析

1、页面开始使用

$('#myPanel').panel({

fit:true,

content:'<iframe scrolling="auto" frameborder="0"  src="'+url+'" style="width:100%;height:100%;"></iframe>'

});

将 iframe 作为 panel的内容面板加载,panel 刷新本身需要花费一些时间,调整后直接用 iframe,将 panel 去掉

2、右侧iframe  的页面大量使用了easyui 的控件,大部分都是以class 样式的形式使用

 

1对于 easyui 的时间控件DateBox 和DateTimeBox,IE6 在渲染的时候,很耗费时间,导致页面长时间显示空白,最后更换成新的时间控件My97DatePicker ,页面响应时间提高 3s 左右

 

2对于页面上的 ComboBox 控件,在 select 组件上加了  class="easyui-combobox",页面初始加载的时候就开始渲染这些组件,导致页面响应缓慢,最后将easyui 的样式和属性全部去掉,在页面加载完成的方法里再渲染,加载后台数据的同时渲染页面,提高效率。

 

 

 

2.3 页面闪烁问题

1) 问题现象

在 IE6 下,点击左侧的菜单,有几个菜单点击后,整个页面会全部刷白,出现如下的情况,短时间的闪烁感觉。

 

2) 问题分析

1页面开始使用原生 HTML 标签 select ,而且没有用 ComboBox 组件渲染。

 

IE6 在加载 select 组件时导致页面闪烁,最后全部用 ComboBox 组件。

2页面上的DataGrid 组件的分页栏

 

这个分页栏的“页面显示数据条数”,也是采用 select 实现的,而且控件默认是显示该功能的,最后修改在公共 js 里加入

$.fn.pagination.defaults.showPageList = false;

将控件的默认设置改为不显示。

2.4 页面不加载,提示 js 错误问题

1) 问题现象

在 IE6 下,页面加载是提示js 错误,页面停止加载。

 

 

2) 问题分析

1 修改前部分代码

$('#gridTableB').datagrid( {

       url:'',

       method : 'post',

       loadMsg : '数据载入中,请稍等...',

       pagination : true,

       rownumbers : true,

       columns : [ [{

              field : 'gesBsmAlarm.occurOrgidName',

              title : '区域',

              width : 35,

              sortable : true,     //请注意,引起错误的位置,多了一个 逗号

       }, {

              field : 'gesBsmAlarm.equipModel',

              title : '告警类型',

              width : 60,

              sortable : true

       }] ]

});

Easyui 的 DataGrid 控件的属性最后一项,不能写一个 “,”,这在 IE7+ 和FF 等浏览器下没有问题,在 IE6  下报js 错误。

2.5 DataGrid 上自定义按钮的导出不反应问题

1) 问题现象

在 IE6 下, DataGrid 的分页自定义按钮上的导出报表功能不起作用,并且后台程序会报错,前台无任何反应。

 

 

2) 问题分析

1修改前代码

 $(function(){

       $('#custCircuitTable').datagrid({

              url : '',

              pagination : true,

              rownumbers : true,

              columns : [ [ {

                            field : 'str0',

                            title : '省中心',

                            align : 'center',

                            width : 80,

                            styler : changeColor

                     } ] ]

       });

       var pager = $('#custCircuitTable').datagrid('getPager');

       pager.pagination( {

              buttons : [ {

                     title : 'ddddd',

                     iconCls : 'icon-export',

                     handler : function() {

                            exportExcel();

                     }

              } ]

       });

});  

Easyui 对 DataGrid 的分页控件的自定义按钮解析时,解析成下图的形式

 

其中的 a 标签的 href="javascript:void(0)",在 IE6 下,当点击这个链接时,IE6中会先执行a 中的javascript:void(0) ,之后IE6 认为请求已经结束,其实真正的请求在 exportExcel(); 方法里执行了,并且请求了后台的数据,后台执行完成之后,返回数据到前台,发现请求已经被关闭,然后后台就报错了。

最后代码修改后全部不再采用DataGrid的自定义分页按钮,用 LinkButton 实现,并给 href=”#”。

2.6 依旧存在的问题

1) 问题现象

在 IE6 下,快速定位资源客户树上的客户,速度很慢

 

2) 问题分析

IE6 执行js 的选择元素和创建对象的方法速度很慢,但是在树形结构中,查找一个节点的时候需要大量选择元素和创建对象,导致方法执行缓慢,目前尚未找到好的解决方案。

3.     总结

通过端到端系统的实战,对 easyui 框架有了更深的认识,个人使用的一些感受:

1遇到问题并且没有好的解决思路的时候,大致浏览一下官方的文档,或许你现在遇到的问题,框架的开发人员都已经给你解决好了,不必劳神了。

2遇到问题并且查找了半天没有找到原因的时候,将你的代码缩减到最简单,对比官方给的Demo,找到有哪些差异,逐个排除。

3遇到问题实在解决不了的时候,你需要深入理解框架的实现原理,对每一个控件的工作方式、控件处理数据的逻辑大致了解,查看控件最终在页面的展示形式,判断自己的数据是否符合要求。

posted on 2013-08-30 11:00  刘继才  阅读(1938)  评论(0编辑  收藏  举报