現象:
AJAX返回的html無法做到自動渲染為EasyUI的樣式.比如:class="easyui-layout" 等
處理方法:
在html片段加載完畢后使用
- $.parser.parse(context)
即可重新渲染。
實現原理:
首先附上jquery.parser.js的源碼
- (function($){
- $.parser = {
- auto: true,
- plugins:['linkbutton','menu','menubutton','splitbutton','layout',
- 'tree','window','dialog','datagrid',
- 'combobox','combotree','numberbox','validatebox',
- 'calendar','datebox','panel','tabs','accordion'
- ],
- parse: function(context){
- if ($.parser.auto){
- for(var i=0; i<$.parser.plugins.length; i++){
- (function(){
- var name = $.parser.plugins[i];
- var r = $('.easyui-' + name, context);
- if (r.length){
- if (r[name]){
- r[name]();
- } else if (window.easyloader){
- easyloader.load(name, function(){
- r[name]();
- })
- }
- }
- })();
- }
- }
- }
- };
- $(function(){
- $.parser.parse();
- });
- })(jQuery);
框架默認在頁面加載完成后自動使用$.parser.parse()對整個文檔進行渲染
1. jQuery EasyUI動態添加控件或者ajax加載頁面后不能自動渲染問題的解決方法:
我們之所以在頁面中,只要書寫相應easyui的class,Easyui就能成功渲染頁面,這是因為解析器在默認情況下,parser會在文檔裝載完成的時候($(document).ready)被調用一次,而且是渲染整個頁面。
然而當頁面裝載完后,如果用javascript生成的DOM中包含了Easyui支持控件的class,比如說,用javascript生成了以下代碼:
<a id="tt" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'">easyui</a>
雖然頁面上有這樣的DOM了,但是沒有被渲染為Easyui的linkbutton插件,原因是Easyui並不會一直監聽頁面,所以不會主動渲染,這時候就需要手工調用Easyui的parser進行解析了。
手工調用需要注意以下幾點:
解析目標為指定DOM的所有子孫元素,不包含這個DOM自身:
比如上面代碼生成的HTML,id="tt"是我們想要的LinkButton,像下面代碼去手工解析的話是得不到你想要的結果的:
$.parser.parse($('#tt'));
道理很簡單,parser只渲染tt的子孫元素,並不包括tt自身,而它的子孫元素並不包含任何Easyui支持的控件class,所以這個地方就得不到你想要的效果了,應該這樣寫:
$.parser.parse($('#tt').parent());
渲染tt的父節點的所有子孫元素就可以了,不管你的javascript輸出什么DOM,直接渲染其父節點就可以保證頁面能被正確解析。
----------------------------------------------
試了下,可以。