IE 除了发明 innerHTML这个快捷创建DOM元素(及其属性等)外,还发明了insertAdjacentHTML
/insertAdjacentText
方法。
它们首次在IE4中引入,随后其它浏览器如Opera、Safari、Chrome相继实现了它们。唯独Firefox没有实现。
鉴于insertAdjacentHTML被众多浏览器实现,html5已经将 其
列纳入,insertAdjacentText则没那么幸运。
Firefox中使用另外一些方式实现了相同功能。在 这篇
中通过扩展HTMLElement.prototype为Firefox实现了与IE相同的接口方法。
在Ext.DomHelper中,它没有去扩展HTMLElement.prototype(部分人会认为是污染了原生的HTMLElement,暂且放一边)。而是提供了以下四个方法
insertBefore 在元素前面插入新的元素
insertAfter 在元素后面插入新的元素
insertFirst 在元素内部的第一个位置插入新的元素
append 在元素内部最后一个位置插入新的元素
在上一篇中提到了,这四个方法都调用私有的doInsert函数,而doInsert函数内部调用的是Ext.DomHelper的insertHtml方法。
可回到 上一篇
看看那个截图
便一目了然。因此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' + (/end/i.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 + '"';
},
insertHtml 的实现也较容易理解,两个分支
分支1,支持el.insertAdjacentHTML的浏览器(IE/Chrome/Safari/Opera)使用el.insertAdjacentHTML
分支2,不支持el.insertAdjacentHTML的浏览器(Firefox)使用range.createContextualFragment+el.insertBefore/el.appendChild
分支1中对table/tr/td元素做了单独处理,相应的私有函数是ieTable,insertIntoTable。insertIntoTable中先创建了一个div再添加table,是因为 IE6/7/8中Table元素的innerHTML Bug
。
Ext.DomHelper 还剩下最后一个方法applyStyles,
applyStyles : function(el, styles){
if(styles){
var i = 0,
len,
style;
el = Ext.fly(el);
if(Ext.isFunction(styles)){
styles = styles.call();
}
if(Ext.isString(styles)){
styles = styles.trim().split(/\s*(?::|;)\s*/);
for(len = styles.length; i < len;){
el.setStyle(styles[i++], styles[i++]);
}
}else if (Ext.isObject(styles)){
el.setStyle(styles);
}
}
},
设置HTML元素的的样式,设置的方式很灵活,参数styles可以是字符串'color:red',可以是对象{color:red}甚至可以是个函数function(){return 'color:red'}。
el = Ext.fly(el);
该句中的Ext.fly是获取Ext.Element对象,定义在Ext.Element中。后一篇
提到了Ext.fly与Ext.get的区别。。
styles = styles.call();
当styles为函数类型时,直接调用该函数,此处用call执行函数,但没有传参数。因此完全可以去掉call直接使用小括号()调用:styles = styles();
函数的各种调用方式见:具名函数的四种调用方式
当styles为字符串类型时,有以下语句
styles = styles.trim().split(/\s*(?::|;)\s*/);
直接使用 trim 方法,但Ext并没有为String扩展该方法,还记得第三篇 原型扩展
,只给String添加了一个format方法。
Ext.applyIf(String, {
format : function(format){
var args = Ext.toArray(arguments, 1);
return format.replace(/\{(\d+)\}/g, function(m, i){
return args[i];
});
}
});
这是一个bug
,另见 trim的各种实现
。
分享到:
相关推荐
- **EXT** 官方文档提供了丰富的资源,包括教程、API 文档等,可以帮助开发者深入了解 **EXT** 的各个部分。 - 学习 **EXT 2** 的新特性也是很有帮助的,如组件模型、容器模型、布局等。 通过上述知识点的学习,...
Ext.DomQuery允许开发者使用类似CSS选择器的语言来查询DOM元素,而DomHelper提供了一系列工具方法来创建、插入、更新和删除DOM元素。Template则是一种用于动态生成HTML的模板引擎,它支持数据绑定,使得动态内容的...
Ext.Element是ExtJS的心脏,它扩展了原生的DOM元素,增加了动画、尺寸调整、位置控制等功能。Ext.Template和Ext.XTemplate是用于处理模板的类,能够实现内容的动态插入和渲染。通过模板可以快速定义数据的展示方式,...
链表则在插入和删除上具有优势,但访问元素速度较慢。栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景;队列则遵循先进先出(FIFO)原则,适用于任务调度、打印队列等。树,特别是二叉树,被...
门窗、门窗套和窗帘的建模也遵循类似步骤,使用EXT命令拉伸,并通过SU命令处理相互关系,将这些元素放置在“1-门窗”图层。此时,可以通过隐藏某些图层(如“1-吊顶”),使用渲染命令(如rr)生成墙体、地面和门窗...
`Ext.apply()` 会覆盖目标对象的属性,而 `Ext.applyIf()` 只会在目标对象没有该属性时添加。 #### 四、消息框 - **提示框**:用于显示简单的消息提示。 - **输入框**:允许用户输入数据。 - **确认框**:询问用户...
PDFLIB库则提供了一个接口,使得开发者可以通过编程方式控制PDF文档的各个元素,如页面布局、字体、颜色、图形和图像等。 在C++项目中使用PDFLIB,首先需要包含库文件`pdflib.lib`。这是一个静态链接库,它包含了...
例如`SET key value`用于设置键值,`GET key`用于获取键值,`DEL key`用于删除键,`LPUSH key value`用于向列表头部插入元素,`LRANGE key start stop`用于获取列表的一部分,`HSET key field value`用于在哈希表中...
哈希函数将键转换为数组下标,确保键值对能够被均匀地分布在各个桶中,减少冲突的可能性。比较函数用于在发生冲突时,确定两个键是否相等。 冲突是哈希映射中不可避免的问题,因为一个键可能通过哈希函数映射到同一...
SSI(Server Side Includes)是一种在服务器端处理动态内容的技术,常用于将共享的页面元素插入到多个HTML文件中,以提高效率和维护性。 在这个"extjs4-ssi例子"中,我们可能看到的是一个基于ExtJS 4构建的用户管理...
在这个过程中,会创建一个描述文件系统的数据结构`file_system_type`,并将这个数据结构插入到全局链表`file_systems`的尾部。通过这种方式,VFS可以遍历`file_systems`链表来识别内核所支持的文件系统类型。 #####...
在CAD设计中,经常需要重复使用相同的图形元素,此时可以将这些元素定义为“块”,以便快速插入到图纸的其他位置。 **C:** 绘制圆。用于绘制圆形,是CAD中最基础的功能之一。 **D:** 图层管理器。在复杂的CAD项目...
1. `manifest.json`:这是Web扩展的配置文件,定义了扩展的元数据(如名称、版本、权限等),以及扩展的各个组件,如背景脚本、内容脚本、UI元素等。 2. `background.js`:背景脚本通常运行在浏览器后台,处理非...
在CAD(计算机辅助设计)软件中,掌握快捷键可以极大地提高绘图效率。这份文档"CAD中常用的快捷键2.docx"提供了许多关键命令的简写形式,方便用户快速执行常用操作。以下是对这些快捷键的详细解释: 1. L:直线 ...
- 适用场景:确保图块插入位置的准确性。 8. **区域图样填充**:`BH` - 功能:为指定区域添加图案填充。 - 适用场景:用于表示特定材质或功能区。 9. **将实体图形定义为一个图块**:`B` - 功能:将一组实体...
- **DOM(Document Object Model):** DOM 提供了一种将 XML 文档映射为树形结构的方法,可以方便地访问文档中的各个元素。DOM 的缺点是需要将整个文档加载到内存中,这可能不适合处理大型文档。 - **SAX(Simple...
在CAD(计算机辅助设计)中,熟练掌握快捷键能够极大地提高工作效率,尤其是对于初学者而言,熟悉这些基本操作是至关重要的。以下是一些关键的CAD快捷键和它们的功能详解: 1. **L** - 直线:绘制直线,是CAD中最...
- **线程**: 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java中每个线程都由一个Thread对象表示。 - **线程生命周期**: 新建(New)、就绪(Runnable)、运行...