Ext.dom.Helper

Alternate names

Ext.DomHelper
Ext.core.DomHelper

Hierarchy

Files

DomHelper 类提供了一个抽象层,并且明显支持通过DOM创建元素或使用HTML片段. 它也有从您的DOM构建代码中创建HTML片段模板的能力.

DomHelper 元素规范对象

在创建元素时用到的规范对象. 此对象的属性被认为是元素属性, 除了以下4种特殊属性:

  • tag - 元素的标签名.
  • children or cn - 被创建和可链接的同种元素的定义对象的数组. 其可以随你愿意嵌套多深的级次.
  • cls - 元素的class属性. 根据DomHepler使用的是fragments还是DOM, 决定该属性是以HTML片段中的"class"属性为结束,还是一个DOM节点的类名为结束.
  • html - 元素的innerHTML.

NOTE: 对于其他任意的属性,该值目前在构建元素的HTML字符串前,不会 自动进行HTML转义. 这意味着如果你的属性值中包含特殊字符通常不会被双引号的属性值所允许, 所以你必须事先手动对其进行HTML编码(参考Ext.String.htmlEncode), 或者冒着生成畸形的HTML的风险. 这种行为方式在未来将有所改变.

插入方法

一般使用到的插入方法:

例如

这就是个例子, 有个带3个子项的无序序列要追加到已经存在的id为‘my-div’的元素后:

var dh = Ext.DomHelper; // 创建一个速记别名
// 规范对象
var spec = {
    id: 'my-ul',
    tag: 'ul',
    cls: 'my-list',
    // 创建后追加其孩子
    children: [     // 也可以指定用'cn'代替'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 list = dh.append(
    'my-div', // 上下文元素'my-div'可以是id,也可以是实际节点
    spec      // 规范对象
);

在该类中元素创建的规格参数也可以被传递为规格对象数组. 可以有效的被用于插入多个同级节点现有容器. 例如,给上例插入多个列表项:

dh.append('my-ul', [
    {tag: 'li', id: 'item3', html: 'List Item 3'},
    {tag: 'li', id: 'item4', html: 'List Item 4'}
]);

模板

真正的权力是在于内置的模板. 取代创建或添加任何元素的是返回一个模板对象createTemplate,可反复用于插入新元素. 重温上例,我们这次可以利用模板:

// 创建节点
var list = dh.append('my-div', {tag: 'ul', cls: 'my-list'});
// 获取模板
var tpl = dh.createTemplate({tag: 'li', id: 'item{0}', html: 'List Item {0}'});

for(var i = 0; i < 5, i++){
    tpl.append(list, [i]); // 使用模板附加到实际的节点
}

使用模板的另一个例子:

var html = '<a id="{0}" href="{1}" class="nav">{2}</a>';

var tpl = new Ext.DomHelper.createTemplate(html);
tpl.append('blog-roll', ['link1', 'http://www.edspencer.net/', "Ed's Site"]);
tpl.append('blog-roll', ['link2', 'http://www.dustindiaz.com/', "Dustin's Site"]);

相同的例子使用命名参数的方式:

var html = '<a id="{id}" href="{url}" class="nav">{text}</a>';

var tpl = new Ext.DomHelper.createTemplate(html);
tpl.append('blog-roll', {
    id: 'link1',
    url: 'http://www.edspencer.net/',
    text: "Ed's Site"
});
tpl.append('blog-roll', {
    id: 'link2',
    url: 'http://www.dustindiaz.com/',
    text: "Dustin's Site"
});

编译模板

模板是使用正则表达式方式. 其效果是显著的, 但是你若要用同一个模板添加一堆的DOM元素,还可以通过模板的"compiling"功能来进一步. "compile()"方式的工作原理是在模板被解析并且打破了不同的变量点, 然后创建输出一个动态函数. 生成的函数执行方式是将这些零部件和传递的变量通过字符串连接起来, 而不是用正则表达式的方式.

var html = '<a id="{id}" href="{url}" class="nav">{text}</a>';

var tpl = new Ext.DomHelper.createTemplate(html);
tpl.compile();

//... 然后在按正常方式使用模板

性能提升

DomHelper可以明显的创建HTML的片段. 使用HTML片段替代DOM可以显著的提高性能.

元素创建的规格参数也可以是字符串. 若useDom为false,则本字符串就可以作为innerHTML. 若If useDom 为 true, 一个字符串的规格参数在结果中会被创建为一个文本节点. 用法:

Ext.DomHelper.useDom = true; // 强制它使用DOM ;降低性能
Defined By

Properties

扩展事件

Defaults to: []

本身 获取当前类的引用,此对象被实例化。不同于 statics, this.self是依赖范围,它意味着要使用动态继承。 ...

本身

获取当前类的引用,此对象被实例化。不同于 statics, this.self是依赖范围,它意味着要使用动态继承。 参见 statics 详细对比

Ext.define('My.Cat', {
    statics: {
        speciesName: 'Cat' // My.Cat.speciesName = 'Cat'
    },

    constructor: function() {
        alert(this.self.speciesName); // 依赖 'this'
    },

    clone: function() {
        return new this.self();
    }
});


Ext.define('My.SnowLeopard', {
    extend: 'My.Cat',
    statics: {
        speciesName: 'Snow Leopard'         // My.SnowLeopard.speciesName = 'Snow Leopard'
    }
});

var cat = new My.Cat();                     // alerts 'Cat' 猫
var snowLeopard = new My.SnowLeopard();     // alerts 'Snow Leopard' 雪豹

var clone = snowLeopard.clone();
alert(Ext.getClassName(clone));             // alerts 'My.SnowLeopard'
Ext.dom.Helper
: Boolean

设为True,则会强制用DOM代替html片段.

Defaults to: false

Defined By

Methods

( Object config )private

添加配置

Parameters

Parameters

( Object name, Object member )private

Parameters

( Object xtype )private

添加 Xtype

Parameters

( String/HTMLElement/Ext.Element el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.Element

创建新的DOM节点并附加到el后。

Parameters

Returns

设置元素的样式

Parameters

  • el : String/HTMLElement

    要应用样式的元素

  • styles : String/Object/Function

    样式规范字符串,即:'width:100px',或{width:'100px'}形式的对象,或者一个返回样式规范的函数。

( Array/Arguments ) : Objectdeprecatedprotected
调用原来的方法,这是以前的override重写 Ext.define('My.Cat', { constructor: function() { alert("I'm a cat!"); } }); ...

调用原来的方法,这是以前的override重写

Ext.define('My.Cat', {
    constructor: function() {
        alert("I'm a cat!");
    }
});

My.Cat.override({
    constructor: function() {
        alert("I'm going to be a cat!");

        this.callOverridden();

        alert("Meeeeoooowwww");
    }
});

var kitty = new My.Cat(); // alerts "I'm going to be a cat!"
                          // alerts "I'm a cat!"
                          // alerts "Meeeeoooowwww"

This method has been deprecated since 4.1

版本 使用 callParent 代替.

Parameters

  • : Array/Arguments

    参数的参数,数组或'参数'对象 来自当前方法,例如: this.callOverridden(arguments)

Returns

  • Object

    返回调用重写方法的结果。

( Array/Arguments args ) : Objectprotected

所谓的"parent"方法是指当前的方法。 这是以前的方法派生或重写(参见 Ext.define)。

 Ext.define('My.Base', {
     constructor: function (x) {
         this.x = x;
     },

     statics: {
         method: function (x) {
             return x;
         }
     }
 });

 Ext.define('My.Derived', {
     extend: 'My.Base',

     constructor: function () {
         this.callParent([21]);
     }
 });

 var obj = new My.Derived();

 alert(obj.x);  // alerts 21

这可以用来重写如下:

 Ext.define('My.DerivedOverride', {
     override: 'My.Derived',

     constructor: function (x) {
         this.callParent([x*2]); // 调用原来的My.Derived构造
     }
 });

 var obj = new My.Derived();

 alert(obj.x);  // 现在提示 42

This also works with static methods.

 Ext.define('My.Derived2', {
     extend: 'My.Base',

     statics: {
         method: function (x) {
             return this.callParent([x*2]); // 调用 My.Base.method
         }
     }
 });

 alert(My.Base.method(10);     // alerts 10
 alert(My.Derived2.method(10); // alerts 20

然后,它也可以重写静态方法。

 Ext.define('My.Derived2Override', {
     override: 'My.Derived2',

     statics: {
         method: function (x) {
             return this.callParent([x*2]); // 调用 My.Derived2.method
         }
     }
 });

 alert(My.Derived2.method(10); // 现在提示 40

Parameters

  • args : Array/Arguments

    这个参数, 通过当前方法得到数组或者 arguments 对象, 例如: this.callParent(arguments)

Returns

  • Object

    返回调用父类的方法的结果。

Ext.dom.Helper
( Object html )private

修复了IE9的createContextualFragment缺少方法

Parameters

Ext.dom.Helper
( Object/String o ) : HTMLElement

创建新的DOM元素(们),而不将它们插入到文档.

Parameters

  • o : Object/String

    DOM对象的规范(和子集) 或原始的HTML 文件

Returns

  • HTMLElement

    The new uninserted node

Ext.dom.Helper
( Object spec ) : String

markup的别名.

返回传入元素的配置标记。

Parameters

Returns

Ext.dom.Helper
( Object o ) : Ext.Template

根据DOM对象的规格创建一个新的Ext.Template模板.

Parameters

  • o : Object

    DOM对象的规格(和子集)

Returns

( Object config )private

拓展

Parameters

把样式从给定的对象转变成文本。 样式是CSS样式名及其结合值。

该方法的基本形式返回一个字符串:

 var s = Ext.DomHelper.generateStyles({
     backgroundColor: 'red'
 });

 // s = 'background-color:red;'

或者,该方法能向输出数组添加。

 var buf = [];

 ...

 Ext.DomHelper.generateStyles({
     backgroundColor: 'red'
 }, buf);

这样的话,样式文本被进栈到数组并返回该数组。

Parameters

  • styles : Object

    描述样式的对象。

  • buffer : String[] (optional)

    输出数组。

Returns

  • String/String[]

    如果数组参数被传入,则返回数组,否则返回样式字符串。

( Object name )private

得到配置项

Parameters

得到初始化配置项

Parameters

( Object config )private

根据名称判断配置项是否存在

Parameters

( Object config ) : Objectprotected
这个类的初始化配置。典型例子: Ext.define('My.awesome.Class', { // 这是默认配置 config: { name: 'Awesome', isAwes...

这个类的初始化配置。典型例子:

Ext.define('My.awesome.Class', {
    // 这是默认配置
    config: {
        name: 'Awesome',
        isAwesome: true
    },

    constructor: function(config) {
        this.initConfig(config);
    }
});

var awesome = new My.awesome.Class({
    name: 'Super Awesome'
});

alert(awesome.getName()); // 'Super Awesome' 超级棒

Parameters

Returns

  • Object

    mixins 混入原型 键-值对

( String/HTMLElement/Ext.Element el, Object o, [Boolean returnElement] ) : HTMLElement/Ext.Element

创建新的DOM节点并插入到el后。

Parameters

Returns

( String/HTMLElement/Ext.Element el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.Element

创建新的DOM节点并插入到el前。

Parameters

Returns

( String/HTMLElement/Ext.Element el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.Element

创建新的DOM节点并作为le的第一个子节点。

Parameters

Returns

( String where, HTMLElement/TextNode el, String html ) : HTMLElement

向DOM插入HTML片段。

Parameters

  • where : String

    html插入元素的位置 - beforeBegin, afterBegin, beforeEnd, afterEnd。

    例如下面的HTML:<div>Contents</div>

    使用不同的where值插入到元素的如下位置:

    • beforeBegin: <HERE><div>Contents</div>
    • afterBegin: <div><HERE>Contents</div>
    • beforeEnd: <div>Contents<HERE></div>
    • afterEnd: <div>Contents</div><HERE>
  • el : HTMLElement/TextNode

    上下文元素

  • html : String

    HTML片段

Returns

  • HTMLElement

    新节点

Ext.dom.Helper
( Object tag, Object where, Object destinationEl, Object html )private

对IE破表实现的讨厌代码

Parameters

返回传入元素的配置标记。

Parameters

Returns

( Object name, Object mixinClass )private

内部使用混入预处理器(mixins pre-processor)

Parameters

( Object names, Object callback, Object scope )private

更新配置项

Parameters

( Object fn, Object scope )private

扩展事件

Parameters

Ext.dom.Helper
( String/HTMLElement/Ext.Element el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.Element

创建新的DOM元素,并覆盖el上下文的内容.

Parameters

  • el : String/HTMLElement/Ext.Element

    上下文元素

  • o : Object/String

    DOM 对象的规格(以及其孩子)或原始的HTML文件

  • returnElement : Boolean (optional)

    设为true则返回一个Ext.Element

Returns

Overrides: Ext.dom.AbstractHelper.overwrite

( Object config, Object applyIfNotSet )private

设置配置项

Parameters

获取从该对象被实例化的类的引用。 请注意不同于 self, this.statics()是独立的作用域,无论this是否运行,总是返回其中的调用类。

Ext.define('My.Cat', {
    statics: {
        totalCreated: 0,
        speciesName: 'Cat' // My.Cat.speciesName = 'Cat'
    },

    constructor: function() {
        var statics = this.statics();

        alert(statics.speciesName);     // 总是等于'Cat',无论'this'是什么,
                                        // 相当于:My.Cat.speciesName

        alert(this.self.speciesName);   // 依赖 'this'

        statics.totalCreated++;
    },

    clone: function() {
        var cloned = new this.self;                      // 依赖 'this'

        cloned.groupName = this.statics().speciesName;   // 相当于: My.Cat.speciesName

        return cloned;
    }
});


Ext.define('My.SnowLeopard', {
    extend: 'My.Cat',

    statics: {
        speciesName: 'Snow Leopard'     // My.SnowLeopard.speciesName = 'Snow Leopard'
    },

    constructor: function() {
        this.callParent();
    }
});

var cat = new My.Cat();                 // alerts 'Cat', 然后提示 'Cat'

var snowLeopard = new My.SnowLeopard(); // alerts 'Cat', 然后提示 'Snow Leopard'

var clone = snowLeopard.clone();
alert(Ext.getClassName(clone));         // alerts 'My.SnowLeopard'
alert(clone.groupName);                 // alerts 'Cat'

alert(My.Cat.totalCreated);             // alerts 3

Returns

配置扩展