`
zhouyrt
  • 浏览: 1174008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读Ext之十二(在各个位置插入元素)

阅读更多

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的各种实现

 

 

 

6
2
分享到:
评论
2 楼 cxl2086 2011-03-31  
楼主,在ext 2.2 版本中,有如下代码,string已经有了trim方法:

String.prototype.trim = function(){
    var re = /^\s+|\s+$/g;
    return function(){ return this.replace(re, ""); };
}();
1 楼 pfans 2011-01-13  
希望楼主继续,加油!

相关推荐

    EXT开发文档

    - **EXT** 官方文档提供了丰富的资源,包括教程、API 文档等,可以帮助开发者深入了解 **EXT** 的各个部分。 - 学习 **EXT 2** 的新特性也是很有帮助的,如组件模型、容器模型、布局等。 通过上述知识点的学习,...

    extjs核心api详解

    Ext.DomQuery允许开发者使用类似CSS选择器的语言来查询DOM元素,而DomHelper提供了一系列工具方法来创建、插入、更新和删除DOM元素。Template则是一种用于动态生成HTML的模板引擎,它支持数据绑定,使得动态内容的...

    ExtJS使用笔记

    Ext.Element是ExtJS的心脏,它扩展了原生的DOM元素,增加了动画、尺寸调整、位置控制等功能。Ext.Template和Ext.XTemplate是用于处理模板的类,能够实现内容的动态插入和渲染。通过模板可以快速定义数据的展示方式,...

    数据结构与程序设计C语言

    链表则在插入和删除上具有优势,但访问元素速度较慢。栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景;队列则遵循先进先出(FIFO)原则,适用于任务调度、打印队列等。树,特别是二叉树,被...

    CAD三维图的画法.pdf

    门窗、门窗套和窗帘的建模也遵循类似步骤,使用EXT命令拉伸,并通过SU命令处理相互关系,将这些元素放置在“1-门窗”图层。此时,可以通过隐藏某些图层(如“1-吊顶”),使用渲染命令(如rr)生成墙体、地面和门窗...

    ExtJs 中文文档

    `Ext.apply()` 会覆盖目标对象的属性,而 `Ext.applyIf()` 只会在目标对象没有该属性时添加。 #### 四、消息框 - **提示框**:用于显示简单的消息提示。 - **输入框**:允许用户输入数据。 - **确认框**:询问用户...

    使用PDFLIB库创建PDF c++

    PDFLIB库则提供了一个接口,使得开发者可以通过编程方式控制PDF文档的各个元素,如页面布局、字体、颜色、图形和图像等。 在C++项目中使用PDFLIB,首先需要包含库文件`pdflib.lib`。这是一个静态链接库,它包含了...

    Windows系统redis安装方法和各个PHP版本dll文件

    例如`SET key value`用于设置键值,`GET key`用于获取键值,`DEL key`用于删除键,`LPUSH key value`用于向列表头部插入元素,`LRANGE key start stop`用于获取列表的一部分,`HSET key field value`用于在哈希表中...

    哈希映射 hash map

    哈希函数将键转换为数组下标,确保键值对能够被均匀地分布在各个桶中,减少冲突的可能性。比较函数用于在发生冲突时,确定两个键是否相等。 冲突是哈希映射中不可避免的问题,因为一个键可能通过哈希函数映射到同一...

    extjs4-ssi例子

    SSI(Server Side Includes)是一种在服务器端处理动态内容的技术,常用于将共享的页面元素插入到多个HTML文件中,以提高效率和维护性。 在这个"extjs4-ssi例子"中,我们可能看到的是一个基于ExtJS 4构建的用户管理...

    嵌入式Linux文件系统剪裁方法研究

    在这个过程中,会创建一个描述文件系统的数据结构`file_system_type`,并将这个数据结构插入到全局链表`file_systems`的尾部。通过这种方式,VFS可以遍历`file_systems`链表来识别内核所支持的文件系统类型。 #####...

    CAD制图快捷键

    在CAD设计中,经常需要重复使用相同的图形元素,此时可以将这些元素定义为“块”,以便快速插入到图纸的其他位置。 **C:** 绘制圆。用于绘制圆形,是CAD中最基础的功能之一。 **D:** 图层管理器。在复杂的CAD项目...

    Firefox和Chrome的扩展程序可以为任何网址添加评论

    1. `manifest.json`:这是Web扩展的配置文件,定义了扩展的元数据(如名称、版本、权限等),以及扩展的各个组件,如背景脚本、内容脚本、UI元素等。 2. `background.js`:背景脚本通常运行在浏览器后台,处理非...

    CAD中常用的快捷键2.docx

    在CAD(计算机辅助设计)软件中,掌握快捷键可以极大地提高绘图效率。这份文档"CAD中常用的快捷键2.docx"提供了许多关键命令的简写形式,方便用户快速执行常用操作。以下是对这些快捷键的详细解释: 1. L:直线 ...

    Autodesk_CAD2007快捷键大全

    - 适用场景:确保图块插入位置的准确性。 8. **区域图样填充**:`BH` - 功能:为指定区域添加图案填充。 - 适用场景:用于表示特定材质或功能区。 9. **将实体图形定义为一个图块**:`B` - 功能:将一组实体...

    java笔试题大全

    - **DOM(Document Object Model):** DOM 提供了一种将 XML 文档映射为树形结构的方法,可以方便地访问文档中的各个元素。DOM 的缺点是需要将整个文档加载到内存中,这可能不适合处理大型文档。 - **SAX(Simple...

    CAD基础操作

    在CAD(计算机辅助设计)中,熟练掌握快捷键能够极大地提高工作效率,尤其是对于初学者而言,熟悉这些基本操作是至关重要的。以下是一些关键的CAD快捷键和它们的功能详解: 1. **L** - 直线:绘制直线,是CAD中最...

    阿里P8 架构师整理Java学习笔记.pdf

    - **线程**: 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java中每个线程都由一个Thread对象表示。 - **线程生命周期**: 新建(New)、就绪(Runnable)、运行...

Global site tag (gtag.js) - Google Analytics