- 浏览: 321503 次
- 性别:
文章分类
最新评论
-
i042416:
分析在哪?
angular分析 -
何盆盆:
你好,请问您这是Extjs3还是Extjs4
ExtJs源码分析与学习—ExtJs事件机制(一) -
124753561:
引用引用引用引用引用[u][u][u][u][i][i][i] ...
Subvision SVN 服务端与客户端的安装 -
谷超:
请问一下例子中itext是什么版本的?
利用iText生成word文档例子参考 -
geosmart:
正好要用到执行字符串中方法,学习了
java中利用反射机制实现调用给定为字符串的方法名
元素的操作Ext.DomHelper
该类中的函数主要来简化创建DOM元素操作,采用单例模式实现。主要提供了createHtml和createDom函数。createHtml函数根据配置来创建HTML标签,最终通过innerHTML插入到文档中,二createDom函数根据配置来创建DOM对象,最终通过appendChild或insertBefore函数插入到文档中。下面先看方法createHtml
function createHtml(o){ var b = '', attr, val, key, cn; if(typeof o == "string"){ b = o; } else if (Ext.isArray(o)) { for (var i=0; i < o.length; i++) { if(o[i]) { b += createHtml(o[i]); } }; } else { b += '<' + (o.tag = o.tag || 'div'); for (attr in o) { val = o[attr]; if(!confRe.test(attr)){ if (typeof val == "object") { b += ' ' + attr + '="'; for (key in val) { b += key + ':' + val[key] + ';'; }; b += '"'; }else{ b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"'; } } }; // Now either just close the tag or try to add children and close the tag. if (emptyTags.test(o.tag)) { b += '/>'; } else { b += '>'; if ((cn = o.children || o.cn)) { b += createHtml(cn); } else if(o.html){ b += o.html; } b += '</' + o.tag + '>'; } } return b; }
该方法即是内部私有方法,又是类的静态方法(createHtml : createHtml,利用这句把私有方法赋给类的静态方法),可以通过方法 markup返回元素的装饰(markup)
markup : function(o){ return createHtml(o); },
下面详细的讲解一些该方法的内部实现,执行该方法会根据传入参数类型的不同分为三种情况
- 字符串:直接返回
- 数组:循环递归调用
- 对象:处理后转换为html字符串再返回
前两种情况很简单,以下是其简单例子
var str = Ext.DomHelper.createHtml('<div>demo1</div>'); alert(str); // <div>demo1</div> var str = Ext.DomHelper.createHtml(['<div>demo1</div>','<div>demo2</div>']); alert(str); // <div>demo1</div><div>demo2</div>
这里主要看第三种情况,首先看以下例子
var spec = { id: 'my-ul', tag: 'ul', cls: 'my-list', style : {width:'20px',height:'30px'}, // append children after creating children: [ // may also specify 'cn' instead of 'children' {tag: 'li', id: 'item0', html: 'List Item 0'}, {tag: 'li', id: 'item1', html: 'List Item 1'}, {tag: 'li', id: 'item2', html: 'List Item 2'} ] }; var str = Ext.DomHelper.createHtml(spec); alert(str); // <ul id="my-ul" class="my-list" style="width:20px;height:30px;"> //<li id="item0">List Item 0</li><li id="item1">List Item 1</li><li id="item2">List Item 2</li></ul>
实现代码中
b += '<' + (o.tag = o.tag || 'div');
首先生成父节点,默认为div
if(!confRe.test(attr)){
排除掉这些标签tag|children|cn|html
if (typeof val == "object") {
b += ' ' + attr + '="';
for (key in val) {
b += key + ':' + val[key] + ';';
};
b += '"';
}else{
b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"';
}
上面的语句分为两种情况,如果val是对象时,比如style : {width:'20px',height:'30px'},会遍历该对象转化为字符串;如果不是对象时,会直接与b连接,注意对html元素的class,for属性做了特殊处理,因为js中class是保留字,for是关键字。
if (emptyTags.test(o.tag)) {
b += '/>';
}
对于html中单标签(即没有内容的标签),直接结束,比如br、hr
else {
b += '>';
if ((cn = o.children || o.cn)) {
b += createHtml(cn);
} else if(o.html){
b += o.html;
}
b += '</' + o.tag + '>';
}
如果是children或cn则需要递归遍历孩子节点,如果是html则赋值。
该函数中特殊情况利用正则表达式来实现,这种实现可参考。
createHtml最终返回的是html片段,该片段会通过innerHTML添加到文档中去。
下面看方法
applyStyles : function(el, styles){ if (styles) { var matches; el = Ext.fly(el); if (typeof styles == "function") { styles = styles.call(); } if (typeof styles == "string") { cssRe.lastIndex = 0; while ((matches = cssRe.exec(styles))) { el.setStyle(matches[1], matches[2]); } } else if (typeof styles == "object") { el.setStyle(styles); } } },
该方法的功能为把指定的样式应用到元素,styles 可以是表示样式的特定格式字符串,如“width:100px”,也可以是对象的形式如{width:"100px"},还可以是能返回这些格式的函数。
下面看元素插入方法,该类提供了以下插入方法
insertBefore : function(el, o, returnElement) 在指定元素之前插入新元素 insertAfter : function(el, o, returnElement) 在指定元素之后插入新元素 insertFirst : function(el, o, returnElement) 在指定元素内部首位置插入新元素 append : function(el, o, returnElement) 在指定元素内部尾部插入新元素 overwrite : function(el, o, returnElement) 创建新的Dom元素并覆盖el的内容
前四个方法是调用doInsert插入DOM元素,最后一个方法是插入HTML片段。而doInsert调用了关键方法insertHtml,下面看该代码的实现
insertHtml : function(where, el, html){ var hash = {}, hashVal, setStart, range, frag, rangeEl, rs; where = where.toLowerCase(); // add these here because they are used in both branches of the condition. hash[beforebegin] = ['BeforeBegin', 'previousSibling']; hash[afterend] = ['AfterEnd', 'nextSibling']; if (el.insertAdjacentHTML) { if(tableRe.test(el.tagName) && (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){ return rs; } // add these two to the hash. hash[afterbegin] = ['AfterBegin', 'firstChild']; hash[beforeend] = ['BeforeEnd', 'lastChild']; if ((hashVal = hash[where])) { el.insertAdjacentHTML(hashVal[0], html); return el[hashVal[1]]; } } else { range = el.ownerDocument.createRange(); setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before'); if (hash[where]) { range[setStart](el); frag = range.createContextualFragment(html); el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling); return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling']; } else { rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child'; if (el.firstChild) { range[setStart](el[rangeEl]); frag = range.createContextualFragment(html); if(where == afterbegin){ el.insertBefore(frag, el.firstChild); }else{ el.appendChild(frag); } } else { el.innerHTML = html; } return el[rangeEl]; } } throw 'Illegal insertion point -> "' + where + '"'; },
该方法内部分别实现了支持el.insertAdjacentHTML的浏览器和不支持的浏览器,支持el.insertAdjacentHTML的浏览器(IE/Chrome/Safari/Opera)使用el.insertAdjacentHTML。不支持el.insertAdjacentHTML的浏览器(Firefox)使用range.createContextualFragment+el.insertBefore/el.appendChild。对于IE中不支持Table的innerHTML写操作,该方法进行了特殊处理,使用div,把table添加到div中,并返回table,间接实现。下面代码在IE中会报错,连最新的IE9也不支持。
var table = document.createElement('table'); table.innerHTML = '<tr><td>Test table innerHTML</td></tr>'; document.body.appendChild(table);
再看以下例子
<table id='insertTable' border='1'></table> var ieTable = { tag: 'tbody', children: [ {tag: 'tr', children: [ {tag: 'td',html:'Test table innerHTML in IE'}, {tag: 'td',html:'Nasty code for IE is broken table implementation'} ] } ] }; var table1 = Ext.get('insertTable'); Ext.DomHelper.append(table1,ieTable);
需要说明一下,在文件DomHelper-more.js中进行了扩展,实际上是对DOM元素的创建采用方法createDom,部分实现调用了createHtml中的方法,也可以利用参数useDom来限制使用createDom。createDom的实现与createHtml类似。
发表评论
-
ExtJs源码分析与学习—Ext.ToolTip应用
2011-12-29 14:18 1841源码待分析,先粘一例子备用 // ... -
ExtJs源码分析与学习—遮罩层
2011-09-06 16:49 4877类Ext.LoadMask ... -
ExtJs源码分析与学习—Ext.UpdateManager
2011-09-06 16:12 2180如果想让html页面中任意元素自动局部刷新,而不是整 ... -
ExtJs源码分析与学习—ExtJs元素Element(六)
2011-06-08 10:41 1794批量操作元素Ext.CompositeElementLite ... -
ExtJs源码分析与学习—ExtJs元素Element(五)
2011-06-07 17:35 1931元素的查询Ext.DomQuery 该 ... -
ExtJs源码分析与学习—ExtJs元素Element(三)
2011-06-07 17:06 1049Ext.Element扩展 通过Ex ... -
ExtJs源码分析与学习—ExtJs元素Element(二)
2011-06-07 16:42 2638元素操作核心类Ext.Elemen ... -
ExtJs源码分析与学习—ExtJs元素Element(一)
2011-06-07 15:47 2127从这一节开始 ... -
ExtJs源码分析与学习—工具类Ext.util.TextMetrics
2011-06-07 15:11 2037Ext提供了一个 ... -
ExtJs源码分析与学习—ExtJs事件机制(六)
2011-06-07 11:25 1481最后把涉及到Ext事件的相关类图贴到这里 ... -
ExtJs源码分析与学习—ExtJs事件机制(五)
2011-06-07 11:15 3056最近一直忙着做产品,所以好久没有写文章了,下面接着 ... -
Ext 组件操作总结——会不断完善
2011-05-10 16:36 26911、Ext.Component 该组件在渲染的时候会默认的 ... -
ExtJs表单几种验证与扩展
2011-05-03 16:26 4897首先说明一下表单验证与其相关的一些设置 Ext ... -
ExtJs源码分析与学习—ExtJs事件机制(四)
2011-03-19 23:37 5306ExtJs组件事件——ExtJs自定义事件的处理 ... -
ExtJs源码分析与学习—ExtJs事件机制(三)
2011-03-15 20:20 3254这篇讲ExtJs对事件的管理和调用 Ext ... -
ExtJs源码分析与学习—ExtJs事件机制(二)
2011-03-15 20:15 2613在ExtJs源码分析与学习—ExtJs事件机制( ... -
ExtJs源码分析与学习—ExtJs事件机制(一)
2011-03-15 18:53 2831前面讲了ExtJs核 ... -
ExtJs源码分析与学习—ExtJs核心代码扩展
2011-01-20 19:16 2083前面三篇文章参考作者snandy总结了Ext中核心 ... -
ExtJs源码分析与学习—ExtJs核心代码(三)
2011-01-17 17:29 2176Ext为javascript的一些对象进行了扩展,主要有Str ... -
ExtJs源码分析与学习—ExtJs核心代码(二)
2011-01-17 16:23 1856接上篇 下面介绍Ext.js ...
相关推荐
作者采用了"core→element→component"的主线,将整个ExtJS源码结构串联起来,确保读者能逐步深入学习,理解每一层的细节。 "Introduction"章节为初学者提供了入门指导,涵盖了ExtJS的基本概念和安装步骤。"Core...
本书还深入探讨了JavaScript技术,特别是针对ExtJS源码分析所需的JS知识点。虽然不完全是针对JavaScript初学者,但对于进阶开发者,它提供了许多其他书籍中未涉及的内容,如正则表达式的解析原理和高效正则编写,...
- **源码细节**:发布ExtJS源码时会涉及到一些具体的细节问题,如文件结构、依赖关系等。 - **从何入手**:对于初学者来说,可以从简单的示例开始,逐步深入到更复杂的组件和功能。 #### 9. 适配器Adapters与核心...
**二、源码分析** 书中对ExtJS 3.0的源码进行了深入解析,帮助读者理解其内部工作原理。这包括: 1. **核心类库**:讲解了Ext的基础类,如Element、Component、Store、Grid等,这些是构建所有组件的基础。 2. **...
在EXTJS7中,开发人员有时需要允许...通过以上分析,我们可以了解到EXTJS7中实现点击拖拉选择文本的机制,以及如何在组件级别和子元素级别进行配置。开发者可以根据实际需求灵活地调整这些配置,以提供更好的用户体验。
在IT行业中,JavaScript库ExtJS是一个广泛使用的前端框架,它为构建复杂的...因此,深入学习"读Ext之十五(操作批量元素)"这篇博客,并结合`CompositeElementLite.js`的源码分析,将是提升ExtJS开发能力的关键步骤。
EXTJS 3.0.0源码的分析可以帮助我们深入理解其工作原理,从而更好地利用这个框架来开发复杂的Web应用。 EXTJS的核心是组件模型,它包括各种可复用的UI组件,如表格、面板、表单、树形视图、菜单等。在EXT 3.0.0中,...
书中的内容结构严谨,以"core"(核心)、"element"(元素)和"component"(组件)这三个关键词为主线,串联起EXTJS的整个源码体系。同时,通过一个网络办公系统的实例,将各个知识点贯穿起来,使读者能够逐步学习并...
- **Element对象**:Ext的核心概念之一,用于操作DOM元素,提供了丰富的API来进行DOM操作,如获取、设置样式、位置等。 - **获取多个DOM的节点**:可以通过CSS选择器获取多个DOM节点,并进行批量操作。 - **响应...
手册通常包括EXT的基本概念、安装和下载步骤、组件的使用方法、事件处理、Ajax通信、源码分析等多个章节。其中,"EXT简介"部分会介绍EXT的基本理念和架构;"下载EXT"则会指导开发者如何获取EXT库并将其引入项目;...
源码分析涉及组件架构、事件处理流程、数据绑定机制等方面,对于定制高级功能和调试问题尤为重要。 **九、程序规划入门** 在使用EXT JS进行项目开发前,合理的规划至关重要。这包括选择合适的布局、定义组件层次、...
源码分析可以帮助开发者更好地掌握框架的工作原理,从而更有效地进行调试和优化。源码概述章节通常会介绍EXT的架构设计、关键模块的功能及其实现方式,以及在发布源码时需要注意的细节,如依赖管理、代码结构和最佳...
- **源码分析**:深入分析EXT的源码结构,帮助开发者理解其内部机制。 - **细节讲解**:特别关注了在发布EXT源码过程中需要注意的细节问题,如兼容性考虑、性能优化等。 #### 10. EXT程序规划入门 - **准备工作**:...
- **案例分析**:通过具体的案例分析,帮助开发者深入理解 Ext 的使用方法。 综上所述,《EXT 中文手册》涵盖了 Ext 框架的基础知识、核心概念、高级功能以及实际应用案例,对于想要掌握 Ext 开发的读者来说是一份...