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 的使用场景
2012年03月07日 ⁄ 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:
我们之所以在页面中,只要书写相应的class,Easyui就能成功渲染页面,这是因为解析器在默认情况下,会在文档装载完成的时候($(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了,但是没有被渲染为Easyui的accordion插件,原因很简单,Easyui并不会一直监听页面,所以不会主动渲染,这时候就需要手工调用Easyui的parser进行解析了。不过手工调用需要注意以下几点:
(1) 解析目标为指定DOM的所有子孙元素,不包含这个DOM自身:
比如上面代码生成的HTML,id="tt"是我们想要的手风琴DIV,像下面代码去手工解析的话是得不到你想要的结果的:
1 | $.parser.parse($('#tt')); |
道理很简单,parser只渲染tt的子孙元素,并不包括tt自身,而它的子孙元素并不包含任何Easyui支持的控件class,所以这个地方就得不到你想要的手风琴效果了,应该这样写:
1 | $.parser.parse($('#tt').parent()); |
渲染tt的父节点的所有子孙元素就可以了,个人觉得通过jQuery的parent()方法是最安全不过的了,不管你的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小时内删除。
发表评论