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

Ext源码解析:3, DomHelper.js

阅读更多
from http://www.beyondrails.com/blogs/21

Ext的DomHelper主要是定义了一些操作Dom元素的Helper方法:
insertBefore
insertAfter
insertFirst
append
overwrite
insertHtml
applyStyles


Ext支持纯HTML或者数组或一个JavaScript对象来描述用来添加或覆盖的元素,底层实现为私有的createHtml方法:
var createHtml = function(o){
    if(typeof o == 'string'){
        return o;
    }
    var b = "";
    if (Ext.isArray(o)) {
        for (var i = 0, l = o.length; i < l; i++) {
            b += createHtml(o[i]);
        }
        return b;
    }
    if(!o.tag){
        o.tag = "div";
    }
    b += "<" + o.tag;
    for(var attr in o){
        if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || typeof o[attr] == "function") continue;
        if(attr == "style"){
            var s = o["style"];
            if(typeof s == "function"){
                s = s.call();
            }
            if(typeof s == "string"){
                b += ' style="' + s + '"';
            }else if(typeof s == "object"){
                b += ' style="';
                for(var key in s){
                    if(typeof s[key] != "function"){
                        b += key + ":" + s[key] + ";";
                    }
                }
                b += '"';
            }
        }else{
            if(attr == "cls"){
                b += ' class="' + o["cls"] + '"';
            }else if(attr == "htmlFor"){
                b += ' for="' + o["htmlFor"] + '"';
            }else{
                b += " " + attr + '="' + o[attr] + '"';
            }
        }
    }
    if(emptyTags.test(o.tag)){
        b += "/>";
    }else{
        b += ">";
        var cn = o.children || o.cn;
        if(cn){
            b += createHtml(cn);
        } else if(o.html){
            b += o.html;
        }
        b += "</" + o.tag + ">";
    }
    return b;
}

可以看到,
如果参数是String则表示是html,则直接返回;
如果参数是Array则为每个数组元素调用createHtml
如果参数是Object则根据属性来拼接html字符串

其中insertBefore、insertAfter、insertFirst、append都会调用insertHtml方法:
insertHtml : function(where, el, html){
    where = where.toLowerCase();
    if(el.insertAdjacentHTML){
        if(tableRe.test(el.tagName)){
            var rs;
            if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){
                return rs;
            }
        }
        switch(where){
            case "beforebegin":
                el.insertAdjacentHTML('BeforeBegin', html);
                return el.previousSibling;
            case "afterbegin":
                el.insertAdjacentHTML('AfterBegin', html);
                return el.firstChild;
            case "beforeend":
                el.insertAdjacentHTML('BeforeEnd', html);
                return el.lastChild;
            case "afterend":
                el.insertAdjacentHTML('AfterEnd', html);
                return el.nextSibling;
        }
        throw 'Illegal insertion point -> "' + where + '"';
    }
    var range = el.ownerDocument.createRange();
    var frag;
    switch(where){
         case "beforebegin":
            range.setStartBefore(el);
            frag = range.createContextualFragment(html);
            el.parentNode.insertBefore(frag, el);
            return el.previousSibling;
         case "afterbegin":
            if(el.firstChild){
                range.setStartBefore(el.firstChild);
                frag = range.createContextualFragment(html);
                el.insertBefore(frag, el.firstChild);
                return el.firstChild;
            }else{
                el.innerHTML = html;
                return el.firstChild;
            }
        case "beforeend":
            if(el.lastChild){
                range.setStartAfter(el.lastChild);
                frag = range.createContextualFragment(html);
                el.appendChild(frag);
                return el.lastChild;
            }else{
                el.innerHTML = html;
                return el.lastChild;
            }
        case "afterend":
            range.setStartAfter(el);
            frag = range.createContextualFragment(html);
            el.parentNode.insertBefore(frag, el.nextSibling);
            return el.nextSibling;
        }
        throw 'Illegal insertion point -> "' + where + '"';
}

insertHtml方法则先尝试调用insertAdjacentHTML,但由于insertAdjacentHTML只支持IE,所以后面又对其他浏览器做了相应的alternative,模拟IE下的insertAdjacentHTML方法
基本思路是使用createRange来创建一个Range对象,并通过调用setStartBefore或setStartAfter来设置Range相对于其他Node的位置,最后调用createContextualFragment返回一个Dom片段,然后调用insertBefore或appendChild来完成插入html
具体参考Mozilla Developer Center

overwrite方法则实际上是替换Dom元素的innerHTML,而不是顾名思义的“覆盖”
overwrite : function(el, o, returnElement){
    el = Ext.getDom(el);
    el.innerHTML = createHtml(o);
    return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
}
分享到:
评论

相关推荐

    Ext grid To Excel

    if (Ext.isIE6 || Ext.isIE7 || Ext.isSafari || Ext.isSafari2 || Ext.isSafari3) { var fd=Ext.get('frmDummy'); if (!fd) { fd=Ext.DomHelper.append(Ext.getBody(),{tag:'form',method:'post',id:'frmDummy'...

    extjs帮助文档

    - **概述**:Ext.DomHelper类提供了一组用于创建、插入和更新DOM节点的方法。 - **常用方法**: - `Ext.DomHelper.append(parent, config)`:向指定的父元素添加子元素。 - `Ext.DomHelper.insertFirst(parent, ...

    EXT_JS实用开发指南

    EXT JS是一个强大的JavaScript库,主要用于构建用户界面,尤其适用于企业级应用。在使用EXT JS时,首先需要在HTML页面中引入必要的库文件,包括样式表(ext-all.css)、适配器(ext-base.js)以及EXT JS的核心库...

    extjs帮助文档pdf版

    - `Ext.DomHelper.append(parent, config)`: 向父元素添加子元素。 - `Ext.DomHelper.insertHtml(position, ref, html)`: 在指定位置插入HTML字符串。 #### 10. Ext.Template 类 (P.14) - **概述**:用于生成HTML...

    Ext深入浅出 数据传输

    11.17.3 扩展Function.................... 306 11.17.4 扩展Number......................... 308 11.17.5 扩展Array........................... 308 11.18 Ext.ux.Portal ............................... 309 ...

    Ext 学习总结 pdf版

    - **Ext.form概述**:Ext JS中的`Ext.form`模块是用于处理表单元素的强大工具,它提供了各种表单控件(如文本框、下拉列表等),以及验证规则的支持。 - **Ext.TabPanel篇**:`Ext.TabPanel`是一个容器组件,用于...

    ext教程1.pdf

    &lt;script type="text/javascript" src="extjs/adapter/ext/ext-base.js"&gt; &lt;script type="text/javascript" src="extjs/ext-all.js"&gt; ``` 这些文件分别提供了EXTJS 的样式和必要的JavaScript 功能。`Ext.BLANK_IMAGE_...

    Ext中文版手册最新版

    Ext.DomHelper.append(document.body, { tag: 'p', cls: 'some-class' }); // 更新刚添加的p元素的内容 Ext.select('p.some-class').update('ExtCore successfully injected'); }); ``` #### Element模块 **...

    extJs 2.1学习笔记

    目录 1. ExtJs 结构树 2 2. 对ExtJs的态度 3 3. Ext.form概述 4 4. Ext.TabPanel篇 5 5. Function扩展篇 7 6. Ext.data.Store篇 10 ...27. extJs 2.0学习笔记(DomHelper.js篇) 76 28. extJs 2.0学习笔记(ext.js篇) 77

    Extjs中文教程2.x

    - **示例**: `Ext.DomHelper.append('divId', '&lt;span&gt;Text&lt;/span&gt;')`。 **5.2 模板** - **用途**: 用于动态生成 HTML 内容。 - **实现**: `Ext.XTemplate` 类提供模板引擎。 - **示例**: `var tpl = new Ext....

    extjs学习资源

    Ext.DomQuery/DomHelper/Template - **DOM查询**: `Ext.DomQuery`提供了类似jQuery的语法来选择DOM元素。 - **模板引擎**: `Ext.Template`允许开发者使用模板字符串创建HTML,并可以方便地插入数据。 ```...

    ext_core_manual_zhcn.pdf

    - **定义**:ExtCore 是一款基于 MIT 许可发布的轻量级 JavaScript 库,它提供了丰富的功能来帮助开发者快速构建高质量且可扩展的应用程序。 - **目标**:旨在促进 Web 开发的效率,同时确保代码质量与可维护性。 - ...

    EXT_JS实用开发指南_个人整理笔记.docx

    3. **创建窗口组件**:EXT_JS提供了丰富的组件库,如创建窗口组件的示例代码所示,可以创建一个具有标题、宽度和高度的窗口,并填充HTML内容。`Ext.Window`是EXT_JS中的一个核心组件,可以用来创建弹出式窗口。 4. ...

    ext 中文 api

    API 参考 API 参考里面详细描述了所有能在 Ext 类库里面找到的类和组件。最常用的类有: Ext.Element Ext.BorderLayout Ext.DomHelper Ext.TabPanel Ext.UpdateManager

    Extjs2.0中文文档

    3. **页面与脚本的分离**:Ext.js提倡在开发中将页面标记和JavaScript脚本彻底分离,文档中会有介绍如何通过事件管理器Ext.onReady来管理脚本的加载时机和页面的初始化过程。 4. **元素操作与模板**:Ext.js提供了...

    EXT_JS实用开发指南_个人整理笔记

    - **控件(Widgets)**:EXT_JS提供了丰富的可视化组件,如面板、表格、树、窗口等,它们基于底层API构建。 - **实用工具(Utils)**:提供了数据处理、JSON编码解码、日期管理、Ajax请求、Cookie管理等辅助功能。...

    Professional JavaScript Frameworks Prototype, YUI, Ext JS, Dojo and MooTools.pdf

    - **第三部分:Ext JS** - **第17章:架构和库约定** 讨论Ext JS的架构设计和基本约定。 - **第18章:元素、DomHelper 和模板** 介绍如何使用Ext JS处理DOM元素、辅助类和模板。 - **第19章:组件、布局和...

    EXT核心API详解.doc

    1. **Ext类**:EXT库的基础类,提供了许多实用的方法,如创建元素、事件处理等。 2. **Array类**:扩展了JavaScript原生的数组对象,提供了如each、indexOf、remove等功能,增强了数组操作能力。 3. **Number类**...

Global site tag (gtag.js) - Google Analytics