問題(參考:http://blog.csdn.net/zhgl7688/article/details/50970387 ,
http://blog.csdn.net/lcore/article/details/27588017):
進入主界面的時候,頁面的並不是馬上就展現,而是會有一個混亂的過程,之后一閃就又好了。
原因:就是因為easyui是在dom載入完畢之后才會對整個頁面進行解析,當布局和組件比較多的時候,完整的解析組件就需要一個過程,就會出現短暫的界面混亂現象。
分析:easyui解析器$.parser.parse()控制着整個頁面的解析,可以監聽它解析完成事件,加遮罩層提醒等待。
解決辦法:利用$.parser的onComplete 事件+載入遮罩。
1.遮罩層dom,要放在<Body>下的第一個:
<div id="loading" style="position:absolute;z-index:1000;top:0px;left:0px;width:100%;height:100%;background:#DDDDDB;text-align :center;padding-top:20%;"> <h1><font color="#15428B">加載中....</font></h1> </div>
2.監聽$.parser的onComplete,要放在該頁面自定義<script>標簽的第一個,在Jquery Easyui的引用之后第一個最好:
<script> var pc; //不要放在$(function(){});中 $.parser.onComplete = function () { if (pc) clearTimeout(pc); pc = setTimeout(closes, 1000); } function closes() { $('#loading').fadeOut('normal', function () { $(this).remove(); }); } </script>
附:Parser(解析器)應用場景
easyui根據class就能正常的渲染頁面都是靠parser。通常情況下我們在開發的時候並不會用到解析器。下面來看看神馬時候我們需要用到解析器。
1.自動調用parser
最主要的運用場景,只要我們書寫相應的class,easyui就能成功的渲染頁面,這是因為解析器在默認情況下,會在dom加載完成的時候($(docunment).ready)被調用,而且是渲染整個頁面。
2.手動調用parser
需要手動調用的情況是:當頁面已經加載完成,但是此時我們使用js生成的DOM中包含了easyui支持的class,並且我們也有將其渲染成easyui組件的需求。在這種情況下手動調用parser就不可避免了。
以如下代碼為例:
<div class="easyui-accordion" id="tt"> <div title="title1">1</div> <div title="title2">2</div> </div>
當上述代碼的生成在easyui渲染界面之后,由於easyui不會一直監聽頁面,所以該段代碼並不會並渲染成“手風琴DIV”的樣式,這時候就需要我們手動去結下了。不過這里需注意如下方面,上面也有提及。
- 解析目標位指定DOM的所有子孫元素,不包好該DOM本身。因此正確的寫法為:
$parser.parser($('tt').parent());
並非:
$parser.parser($('tt'));
- 盡量不要多次解析同一個DOM元素(ID),頁面初始化就已經主動渲染過dom節點了,你再次手動解析該dom節點時該dom已經被parser重構,得到的DOM就並非是你料想的結果,該方式應該盡量避免。
附:
1.layout中必須存在center,但如果layout只存在center,不如直接用panel;
2.所有easyui的數據型控件,都應該放在easyui的容器組件中。如datagrid的父級應該是panel;
3.fit是根據父級容器撐滿,效果不理想的時候記得找一下他爹;
4.easyui的容器組件,用html初始化更好,而數據控件,則一律用js初始化,可控性更好