jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法
2011-03-22 12:53
现象:
      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代码 
jquery框架原理1. $.parser.auto   //是否自动进行渲染 
2. $.parser.plugins  //包含目前EasyUI框架中所有的插件名称 
3. $.parser.parse(context) 
4. //context  为待查的 DOM 元素集、文档或 jQuery 对象,为空时默认为整个文档 
5. //渲染对象为: class="easyui-pluginName"的元素  
jQuery EasyUI parser 的使用场景
20120307  parser  1237  评论数 1  被围观 3,768 views+
文章目录
[隐藏]
1自动调用parser:
2手动调用parser:
o 2.1(1) 解析目标为指定DOM的所有子孙元素,不包含这个DOM自身:
o 2.2(2) 某些组件无法多次解析同一个DOM元素:
parser,故名意思,就是解析器的意思,别看他只有那么几行代码,jQuery Easyui 能够根据class就能正常渲染页面全靠它了。一般情况下,我们并用不到解析器,本文主要讨论一
下,什么情况下会用到它,如何使用。
自动调用parser
我们之所以在页面中,只要书写相应的classEasyui就能成功渲染页面,这是因为解析器在默认情况下,会在文档装载完成的时候($(document).ready)被调用一次,而且是渲染整个页面。
手动调用parser
有些童鞋反映,当页面装载完后,如果用javascript生成的DOM中包含了Easyui支持控件的class,比如说,用javascript生成了以下代码:
1
<div class="easyui-accordion" id="tt">
2
        <div title="title1">1</div>
3
    <div title="title2">2</div>
4
</div>
虽然页面上有这样的DOM了,但是没有被渲染为Easyuiaccordion插件,原因很简单,Easyui并不会一直监听页面,所以不会主动渲染,这时候就需要手工调用Easyuiparser进行解析了。不过手工调用需要注意以下几点:
(1) 解析目标为指定DOM的所有子孙元素,不包含这个DOM自身:
比如上面代码生成的HTMLid="tt"是我们想要的手风琴DIV,像下面代码去手工解析的话是得不到你想要的结果的:
1
$.parser.parse($('#tt'));
道理很简单,parser只渲染tt的子孙元素,并不包括tt自身,而它的子孙元素并不包含任何Easyui支持的控件class,所以这个地方就得不到你想要的手风琴效果了,应该这样写:
1
$.parser.parse($('#tt').parent());
渲染tt的父节点的所有子孙元素就可以了,个人觉得通过jQueryparent()方法是最安全不过的了,不管你的javascript输出了什么DOM,直接渲染其父节点就可以保证页面能被正确
解析。
(2) 某些组件无法多次解析同一个DOM元素:
如果页面上本身就有tt元素:
1
<div class="easyui-accordion" id="tt">
2
</div>
页面装载完,你通过脚本向tt元素append两个子DIV,然后解析:
1
$('#tt').append('<div title="title1">1</div><div title="title2">2</div>')
2
$.parser.parse($('#tt').parent());
不要以为你会得到一个满意的accordion,你什么也得不到,因为页面初始化的时候parser就主动渲染过tt元素,这时候tt已经被parser重构,你再到脚本中append,得到的DOM结构,其实并不是你预想的结果了,所以要避免这种用法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。