AJAX异步获取HTML之后 JQuery EasyUI 的界面重绘的解决办法
当AJAX异步获取了HTML代码之后,这一段代码是包含JQuery EasyUI 的属性和样式的,这时这些属性和样式并不会生效。这里说说解决方案
我们先来了解页面在刷新或打开时JQuery EasyUI都干了些什么:
在加载完HTML的时候,JQuery EasyUI 会找class=“easyui-xxxx”的样式来初始化JQuery EasyUI 控件,搜索JQuery EasyUI 混淆之后的源代码,找到这么一段:
(function($){
$.parser={auto:true,onComplete:function(_142){
},plugins:["linkbutton","menu","menubutton","splitbutton","tree","combobox","combotree","numberbox","validatebox","numberspinner","timespinner","calendar","datebox","layout","panel","datagrid","tabs","accordion","window","dialog"],parse:function(_143){
var aa=[];
for(var i=0;i<$.parser.plugins.length;i++){
var name=$.parser.plugins[i];
var r=$(".easyui-"+name,_143);
if(r.length){
if(r[name]){
r[name]();
}else{
aa.push({name:name,jq:r});
}
}
}
if(aa.length&&window.easyloader){
var _144=[];
for(var i=0;i<aa.length;i++){
_144.push(aa[i].name);
}
easyloader.load(_144,function(){
for(var i=0;i<aa.length;i++){
var name=aa[i].name;
var jq=aa[i].jq;
jq[name]();
}
$.parser.onComplete.call($.parser,_143);
});
}else{
$.parser.onComplete.call($.parser,_143);
}
}};
$(function(){
if(!window.easyloader&&$.parser.auto){
$.parser.parse();
}
});
})(jQuery);
当看完之后$.parser.parse();这一句不就是重绘JQuery EasyUI 控件的么。当执行这一句话的时候JQuery EasyUI 会对整个页面的DOM进行解析,效率是比较慢的。当然我们AJAX异步获取的仅仅是一段HTML,没有必要对整个页面进行解析。
当我们异步获取来的HTML放入一个容器里,比如这样
$('#xxxx').html(异步获取回来的内容) ,我们在解析这一段异步获取回来的HTML中的JQuery EasyUI控件时,可以这样做:
$.parser.parse($('#xxxx'));
这样就只解析$('#xxxx')内部的HTML中的JQuery EasyUI控件。
此测试已经通过,此方法很可靠。