jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

转自:http://www.cnblogs.com/sunjie9606/archive/2012/09/13/2683636.html

现象:

AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout" 等

处理方法:

在html片段加载完毕后使用

Js代码

  1. $.parser.parse(context)

即可重新渲染。

实现原理:

首先附上jquery.parser.js的源码

Js代码

  1. (function($){
  2. $.parser = {
  3. auto: true,
  4. plugins:[‘linkbutton‘,‘menu‘,‘menubutton‘,‘splitbutton‘,‘layout‘,
  5. ‘tree‘,‘window‘,‘dialog‘,‘datagrid‘,
  6. ‘combobox‘,‘combotree‘,‘numberbox‘,‘validatebox‘,
  7. ‘calendar‘,‘datebox‘,‘panel‘,‘tabs‘,‘accordion‘
  8. ],
  9. parse: function(context){
  10. if ($.parser.auto){
  11. for(var i=0; i<$.parser.plugins.length; i++){
  12. (function(){
  13. var name = $.parser.plugins[i];
  14. var r = $(‘.easyui-‘ + name, context);
  15. if (r.length){
  16. if (r[name]){
  17. r[name]();
  18. } else if (window.easyloader){
  19. easyloader.load(name, function(){
  20. r[name]();
  21. })
  22. }
  23. }
  24. })();
  25. }
  26. }
  27. }
  28. };
  29. $(function(){
  30. $.parser.parse();
  31. });
  32. })(jQuery);

框架默认在页面加载完成后自动使用$.parser.parse()对整个文档进行渲染

Js代码

  1. $.parser.auto   //是否自动进行渲染
  2. $.parser.plugins  //包含目前EasyUI框架中所有的插件名称
  3. $.parser.parse(context)
  4. //context  为待查找的 DOM 元素集、文档或 jQuery 对象,为空时默认为整个文档
  5. //渲染对象为: class="easyui-pluginName"的元素

当AJAX异步获取了HTML代码之后,这一段代码是包含JQuery EasyUI 的属性和样式的,这时这些属性和样式并不会生效。这里说说解决方案

我们先来了解页面在刷新或打开时JQuery EasyUI都干了些什么:

在加载完HTML的时候,JQuery EasyUI 会找class=“easyui-xxxx”的样式来初始化JQuery EasyUI 控件,搜索JQuery EasyUI 混淆之后的源代码,找到这么一段:

(function(Extra open brace or missing close brace.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<Misplaced &(function(){
if(!window.easyloader&&Extra open brace or missing close brace.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控件。

可以使用$.parser.parse();这个方法进行处理;

例如:

$.parser.parse();

表示对整个页面重新渲染,渲染完就可以看到easyui原来的样式了;

var targetObj = $("<input name=‘mydate‘ class=‘easyui-datebox‘>").appendTo("#id");

$.parser.parse(targetObj);

表示重新渲染某个特定的组件。

此测试已经通过,此方法很可靠。

时间: 2024-12-25 14:38:32

jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法的相关文章

使用SplashScreenManager控件定制程序加载页面

需要devexpress版本在12.0及以上才支持 https://www.cnblogs.com/wuhuacong/p/6112461.html 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口 http://blog.csdn.net/archielau/article/details/37401443 ProgressPanel.WaitForm.SplashScreenManager http://blog.csdn.net/qq99

android 在布局中动态添加控件

第一步 Java代码 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 Java代码 final LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01); 第三步:获取需要添加的布局(控件) Java代码 LinearLayout layout = (LinearLayout) inflater.inflate( R

New UI-Java代码动态添加控件或xml布局

New UI-Java代码动态添加控件或xml布局  --转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途! 小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的 力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文 更加的详尽,帮到更多的人,O(∩_∩)O谢谢! 小猪Android开发交流群:小猪Android开发交流群群号:421858269 新Android UI实例大全目录:http://blog.

Android 在布局容器中动态添加控件

这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉已有的控件 3.使用,来个小demo就明白了 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

Jquery easyui的validatebox控件和正则表达式

Validatebox是EasyUI的验证控件,它支持很多验证,比如说是否是email.是否是url等,保证我们输入的数据在进行处理前能够确保其完整性和正确性.验证可以实现在数据层和业务规则层,但应当在表现层进行前端的"保护",因此,我们通常在UI层为用户提供友好的.可以交互的验证体验,避免在应用程序中进行不必要的网络间的往返验证.在前期ASP.NET中,我们接触了六种验证控件,根据这六种验证控件,几乎能够实现所有的验证.那现在说的Validatebox是怎么实现验证的呢? 仔细观察j

android 动态添加控件并实现每个子控件的点击事件

需求:我们要点击进入一家店铺,根据不同的店铺,显示不同条数的子条目 如:消毒间,洗菜间等...这些都是或多或少的,所以需要动态添加: 首先自定义View(linearLayout): package cn.qust.fang.widget; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.widget.MediaController; import io.vov.vitamio.widget.VideoView; import a

winform导入导出excel,后台动态添加控件

思路: 导入: 1,初始化一个OpenFileDialog类 (OpenFileDialog fileDialog = new OpenFileDialog();) 2, 获取用户选择文件的后缀名(string extension = Path.GetExtension(fileDialog.FileName).ToLower();),并设置允许后缀文件名: 3,NPOI转datetable,遍历tatetable转成实体类列表并入库: 导出: 1, 创建提示用户保存类,SaveFileDial

C#动态添加控件到窗体不显示

在FormLoad里面添加控件时,用this.Controls.Add()方法向窗体里面动态添加控件,调试,一直不显示,后来发现原来窗体上有一个groupbox覆盖了整个窗体,其实控件已经添加上去了,只是被遮盖了. 后面改为this.groupBox1.Controls.Add(),把控件添加到groupbox里面就不会被遮盖了 1 private void UniqueForm_Load(object sender, EventArgs e) 2 { 3 if (pFlag == 1) 4 {

DevExpress.XtraLayout.LayoutControl 动态添加控件

// Create an item within a specified group,// bound to a specified data field with the specified editorprivate LayoutControlItem CreateItemWithBoundEditor(BaseEdit editor, object dataSource,   string dataMember, LayoutControlGroup parentGroup) {   ed