`
hideto
  • 浏览: 2678994 次
  • 性别: 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, ...

    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_...

    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_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