Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / source / DomHelper.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5   <title>The source code</title>
6   <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
7   <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
8   <style type="text/css">
9     .highlight { display: block; background-color: #ddd; }
10   </style>
11   <script type="text/javascript">
12     function highlight() {
13       document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
14     }
15   </script>
16 </head>
17 <body onload="prettyPrint(); highlight();">
18   <pre class="prettyprint lang-js"><span id='Ext-DomHelper'>/**
19 </span> * @class Ext.DomHelper
20  * @alternateClassName Ext.core.DomHelper
21  *
22  * &lt;p&gt;The DomHelper class provides a layer of abstraction from DOM and transparently supports creating
23  * elements via DOM or using HTML fragments. It also has the ability to create HTML fragment templates
24  * from your DOM building code.&lt;/p&gt;
25  *
26  * &lt;p&gt;&lt;b&gt;&lt;u&gt;DomHelper element specification object&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
27  * &lt;p&gt;A specification object is used when creating elements. Attributes of this object
28  * are assumed to be element attributes, except for 4 special attributes:
29  * &lt;div class=&quot;mdetail-params&quot;&gt;&lt;ul&gt;
30  * &lt;li&gt;&lt;b&gt;&lt;tt&gt;tag&lt;/tt&gt;&lt;/b&gt; : &lt;div class=&quot;sub-desc&quot;&gt;The tag name of the element&lt;/div&gt;&lt;/li&gt;
31  * &lt;li&gt;&lt;b&gt;&lt;tt&gt;children&lt;/tt&gt;&lt;/b&gt; : or &lt;tt&gt;cn&lt;/tt&gt;&lt;div class=&quot;sub-desc&quot;&gt;An array of the
32  * same kind of element definition objects to be created and appended. These can be nested
33  * as deep as you want.&lt;/div&gt;&lt;/li&gt;
34  * &lt;li&gt;&lt;b&gt;&lt;tt&gt;cls&lt;/tt&gt;&lt;/b&gt; : &lt;div class=&quot;sub-desc&quot;&gt;The class attribute of the element.
35  * This will end up being either the &quot;class&quot; attribute on a HTML fragment or className
36  * for a DOM node, depending on whether DomHelper is using fragments or DOM.&lt;/div&gt;&lt;/li&gt;
37  * &lt;li&gt;&lt;b&gt;&lt;tt&gt;html&lt;/tt&gt;&lt;/b&gt; : &lt;div class=&quot;sub-desc&quot;&gt;The innerHTML for the element&lt;/div&gt;&lt;/li&gt;
38  * &lt;/ul&gt;&lt;/div&gt;&lt;/p&gt;
39  * &lt;p&gt;&lt;b&gt;NOTE:&lt;/b&gt; For other arbitrary attributes, the value will currently &lt;b&gt;not&lt;/b&gt; be automatically
40  * HTML-escaped prior to building the element's HTML string. This means that if your attribute value
41  * contains special characters that would not normally be allowed in a double-quoted attribute value,
42  * you &lt;b&gt;must&lt;/b&gt; manually HTML-encode it beforehand (see {@link Ext.String#htmlEncode}) or risk
43  * malformed HTML being created. This behavior may change in a future release.&lt;/p&gt;
44  *
45  * &lt;p&gt;&lt;b&gt;&lt;u&gt;Insertion methods&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
46  * &lt;p&gt;Commonly used insertion methods:
47  * &lt;div class=&quot;mdetail-params&quot;&gt;&lt;ul&gt;
48  * &lt;li&gt;&lt;tt&gt;{@link #append}&lt;/tt&gt; : &lt;div class=&quot;sub-desc&quot;&gt;&lt;/div&gt;&lt;/li&gt;
49  * &lt;li&gt;&lt;tt&gt;{@link #insertBefore}&lt;/tt&gt; : &lt;div class=&quot;sub-desc&quot;&gt;&lt;/div&gt;&lt;/li&gt;
50  * &lt;li&gt;&lt;tt&gt;{@link #insertAfter}&lt;/tt&gt; : &lt;div class=&quot;sub-desc&quot;&gt;&lt;/div&gt;&lt;/li&gt;
51  * &lt;li&gt;&lt;tt&gt;{@link #overwrite}&lt;/tt&gt; : &lt;div class=&quot;sub-desc&quot;&gt;&lt;/div&gt;&lt;/li&gt;
52  * &lt;li&gt;&lt;tt&gt;{@link #createTemplate}&lt;/tt&gt; : &lt;div class=&quot;sub-desc&quot;&gt;&lt;/div&gt;&lt;/li&gt;
53  * &lt;li&gt;&lt;tt&gt;{@link #insertHtml}&lt;/tt&gt; : &lt;div class=&quot;sub-desc&quot;&gt;&lt;/div&gt;&lt;/li&gt;
54  * &lt;/ul&gt;&lt;/div&gt;&lt;/p&gt;
55  *
56  * &lt;p&gt;&lt;b&gt;&lt;u&gt;Example&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
57  * &lt;p&gt;This is an example, where an unordered list with 3 children items is appended to an existing
58  * element with id &lt;tt&gt;'my-div'&lt;/tt&gt;:&lt;br&gt;
59  &lt;pre&gt;&lt;code&gt;
60 var dh = Ext.DomHelper; // create shorthand alias
61 // specification object
62 var spec = {
63     id: 'my-ul',
64     tag: 'ul',
65     cls: 'my-list',
66     // append children after creating
67     children: [     // may also specify 'cn' instead of 'children'
68         {tag: 'li', id: 'item0', html: 'List Item 0'},
69         {tag: 'li', id: 'item1', html: 'List Item 1'},
70         {tag: 'li', id: 'item2', html: 'List Item 2'}
71     ]
72 };
73 var list = dh.append(
74     'my-div', // the context element 'my-div' can either be the id or the actual node
75     spec      // the specification object
76 );
77  &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
78  * &lt;p&gt;Element creation specification parameters in this class may also be passed as an Array of
79  * specification objects. This can be used to insert multiple sibling nodes into an existing
80  * container very efficiently. For example, to add more list items to the example above:&lt;pre&gt;&lt;code&gt;
81 dh.append('my-ul', [
82     {tag: 'li', id: 'item3', html: 'List Item 3'},
83     {tag: 'li', id: 'item4', html: 'List Item 4'}
84 ]);
85  * &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
86  *
87  * &lt;p&gt;&lt;b&gt;&lt;u&gt;Templating&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
88  * &lt;p&gt;The real power is in the built-in templating. Instead of creating or appending any elements,
89  * &lt;tt&gt;{@link #createTemplate}&lt;/tt&gt; returns a Template object which can be used over and over to
90  * insert new elements. Revisiting the example above, we could utilize templating this time:
91  * &lt;pre&gt;&lt;code&gt;
92 // create the node
93 var list = dh.append('my-div', {tag: 'ul', cls: 'my-list'});
94 // get template
95 var tpl = dh.createTemplate({tag: 'li', id: 'item{0}', html: 'List Item {0}'});
96
97 for(var i = 0; i &lt; 5, i++){
98     tpl.append(list, [i]); // use template to append to the actual node
99 }
100  * &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
101  * &lt;p&gt;An example using a template:&lt;pre&gt;&lt;code&gt;
102 var html = '&lt;a id=&quot;{0}&quot; href=&quot;{1}&quot; class=&quot;nav&quot;&gt;{2}&lt;/a&gt;';
103
104 var tpl = new Ext.DomHelper.createTemplate(html);
105 tpl.append('blog-roll', ['link1', 'http://www.edspencer.net/', &quot;Ed&amp;#39;s Site&quot;]);
106 tpl.append('blog-roll', ['link2', 'http://www.dustindiaz.com/', &quot;Dustin&amp;#39;s Site&quot;]);
107  * &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
108  *
109  * &lt;p&gt;The same example using named parameters:&lt;pre&gt;&lt;code&gt;
110 var html = '&lt;a id=&quot;{id}&quot; href=&quot;{url}&quot; class=&quot;nav&quot;&gt;{text}&lt;/a&gt;';
111
112 var tpl = new Ext.DomHelper.createTemplate(html);
113 tpl.append('blog-roll', {
114     id: 'link1',
115     url: 'http://www.edspencer.net/',
116     text: &quot;Ed&amp;#39;s Site&quot;
117 });
118 tpl.append('blog-roll', {
119     id: 'link2',
120     url: 'http://www.dustindiaz.com/',
121     text: &quot;Dustin&amp;#39;s Site&quot;
122 });
123  * &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
124  *
125  * &lt;p&gt;&lt;b&gt;&lt;u&gt;Compiling Templates&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
126  * &lt;p&gt;Templates are applied using regular expressions. The performance is great, but if
127  * you are adding a bunch of DOM elements using the same template, you can increase
128  * performance even further by {@link Ext.Template#compile &quot;compiling&quot;} the template.
129  * The way &quot;{@link Ext.Template#compile compile()}&quot; works is the template is parsed and
130  * broken up at the different variable points and a dynamic function is created and eval'ed.
131  * The generated function performs string concatenation of these parts and the passed
132  * variables instead of using regular expressions.
133  * &lt;pre&gt;&lt;code&gt;
134 var html = '&lt;a id=&quot;{id}&quot; href=&quot;{url}&quot; class=&quot;nav&quot;&gt;{text}&lt;/a&gt;';
135
136 var tpl = new Ext.DomHelper.createTemplate(html);
137 tpl.compile();
138
139 //... use template like normal
140  * &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
141  *
142  * &lt;p&gt;&lt;b&gt;&lt;u&gt;Performance Boost&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
143  * &lt;p&gt;DomHelper will transparently create HTML fragments when it can. Using HTML fragments instead
144  * of DOM can significantly boost performance.&lt;/p&gt;
145  * &lt;p&gt;Element creation specification parameters may also be strings. If {@link #useDom} is &lt;tt&gt;false&lt;/tt&gt;,
146  * then the string is used as innerHTML. If {@link #useDom} is &lt;tt&gt;true&lt;/tt&gt;, a string specification
147  * results in the creation of a text node. Usage:&lt;/p&gt;
148  * &lt;pre&gt;&lt;code&gt;
149 Ext.DomHelper.useDom = true; // force it to use DOM; reduces performance
150  * &lt;/code&gt;&lt;/pre&gt;
151  * @singleton
152  */
153 Ext.ns('Ext.core');
154 Ext.core.DomHelper = Ext.DomHelper = function(){
155     var tempTableEl = null,
156         emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
157         tableRe = /^table|tbody|tr|td$/i,
158         confRe = /tag|children|cn|html$/i,
159         tableElRe = /td|tr|tbody/i,
160         endRe = /end/i,
161         pub,
162         // kill repeat to save bytes
163         afterbegin = 'afterbegin',
164         afterend = 'afterend',
165         beforebegin = 'beforebegin',
166         beforeend = 'beforeend',
167         ts = '&lt;table&gt;',
168         te = '&lt;/table&gt;',
169         tbs = ts+'&lt;tbody&gt;',
170         tbe = '&lt;/tbody&gt;'+te,
171         trs = tbs + '&lt;tr&gt;',
172         tre = '&lt;/tr&gt;'+tbe;
173
174     // private
175     function doInsert(el, o, returnElement, pos, sibling, append){
176         el = Ext.getDom(el);
177         var newNode;
178         if (pub.useDom) {
179             newNode = createDom(o, null);
180             if (append) {
181                 el.appendChild(newNode);
182             } else {
183                 (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el);
184             }
185         } else {
186             newNode = Ext.DomHelper.insertHtml(pos, el, Ext.DomHelper.createHtml(o));
187         }
188         return returnElement ? Ext.get(newNode, true) : newNode;
189     }
190
191     function createDom(o, parentNode){
192         var el,
193             doc = document,
194             useSet,
195             attr,
196             val,
197             cn;
198
199         if (Ext.isArray(o)) {                       // Allow Arrays of siblings to be inserted
200             el = doc.createDocumentFragment(); // in one shot using a DocumentFragment
201             for (var i = 0, l = o.length; i &lt; l; i++) {
202                 createDom(o[i], el);
203             }
204         } else if (typeof o == 'string') {         // Allow a string as a child spec.
205             el = doc.createTextNode(o);
206         } else {
207             el = doc.createElement( o.tag || 'div' );
208             useSet = !!el.setAttribute; // In IE some elements don't have setAttribute
209             for (attr in o) {
210                 if(!confRe.test(attr)){
211                     val = o[attr];
212                     if(attr == 'cls'){
213                         el.className = val;
214                     }else{
215                         if(useSet){
216                             el.setAttribute(attr, val);
217                         }else{
218                             el[attr] = val;
219                         }
220                     }
221                 }
222             }
223             Ext.DomHelper.applyStyles(el, o.style);
224
225             if ((cn = o.children || o.cn)) {
226                 createDom(cn, el);
227             } else if (o.html) {
228                 el.innerHTML = o.html;
229             }
230         }
231         if(parentNode){
232            parentNode.appendChild(el);
233         }
234         return el;
235     }
236
237     // build as innerHTML where available
238     function createHtml(o){
239         var b = '',
240             attr,
241             val,
242             key,
243             cn,
244             i;
245
246         if(typeof o == &quot;string&quot;){
247             b = o;
248         } else if (Ext.isArray(o)) {
249             for (i=0; i &lt; o.length; i++) {
250                 if(o[i]) {
251                     b += createHtml(o[i]);
252                 }
253             }
254         } else {
255             b += '&lt;' + (o.tag = o.tag || 'div');
256             for (attr in o) {
257                 val = o[attr];
258                 if(!confRe.test(attr)){
259                     if (typeof val == &quot;object&quot;) {
260                         b += ' ' + attr + '=&quot;';
261                         for (key in val) {
262                             b += key + ':' + val[key] + ';';
263                         }
264                         b += '&quot;';
265                     }else{
266                         b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '=&quot;' + val + '&quot;';
267                     }
268                 }
269             }
270             // Now either just close the tag or try to add children and close the tag.
271             if (emptyTags.test(o.tag)) {
272                 b += '/&gt;';
273             } else {
274                 b += '&gt;';
275                 if ((cn = o.children || o.cn)) {
276                     b += createHtml(cn);
277                 } else if(o.html){
278                     b += o.html;
279                 }
280                 b += '&lt;/' + o.tag + '&gt;';
281             }
282         }
283         return b;
284     }
285
286     function ieTable(depth, s, h, e){
287         tempTableEl.innerHTML = [s, h, e].join('');
288         var i = -1,
289             el = tempTableEl,
290             ns;
291         while(++i &lt; depth){
292             el = el.firstChild;
293         }
294 //      If the result is multiple siblings, then encapsulate them into one fragment.
295         ns = el.nextSibling;
296         if (ns){
297             var df = document.createDocumentFragment();
298             while(el){
299                 ns = el.nextSibling;
300                 df.appendChild(el);
301                 el = ns;
302             }
303             el = df;
304         }
305         return el;
306     }
307
308 <span id='Ext-DomHelper-method-insertIntoTable'>    /**
309 </span>     * @ignore
310      * Nasty code for IE's broken table implementation
311      */
312     function insertIntoTable(tag, where, el, html) {
313         var node,
314             before;
315
316         tempTableEl = tempTableEl || document.createElement('div');
317
318         if(tag == 'td' &amp;&amp; (where == afterbegin || where == beforeend) ||
319            !tableElRe.test(tag) &amp;&amp; (where == beforebegin || where == afterend)) {
320             return null;
321         }
322         before = where == beforebegin ? el :
323                  where == afterend ? el.nextSibling :
324                  where == afterbegin ? el.firstChild : null;
325
326         if (where == beforebegin || where == afterend) {
327             el = el.parentNode;
328         }
329
330         if (tag == 'td' || (tag == 'tr' &amp;&amp; (where == beforeend || where == afterbegin))) {
331             node = ieTable(4, trs, html, tre);
332         } else if ((tag == 'tbody' &amp;&amp; (where == beforeend || where == afterbegin)) ||
333                    (tag == 'tr' &amp;&amp; (where == beforebegin || where == afterend))) {
334             node = ieTable(3, tbs, html, tbe);
335         } else {
336             node = ieTable(2, ts, html, te);
337         }
338         el.insertBefore(node, before);
339         return node;
340     }
341
342 <span id='Ext-DomHelper-method-createContextualFragment'>    /**
343 </span>     * @ignore
344      * Fix for IE9 createContextualFragment missing method
345      */
346     function createContextualFragment(html){
347         var div = document.createElement(&quot;div&quot;),
348             fragment = document.createDocumentFragment(),
349             i = 0,
350             length, childNodes;
351
352         div.innerHTML = html;
353         childNodes = div.childNodes;
354         length = childNodes.length;
355
356         for (; i &lt; length; i++) {
357             fragment.appendChild(childNodes[i].cloneNode(true));
358         }
359
360         return fragment;
361     }
362
363     pub = {
364 <span id='Ext-DomHelper-method-markup'>        /**
365 </span>         * Returns the markup for the passed Element(s) config.
366          * @param {Object} o The DOM object spec (and children)
367          * @return {String}
368          */
369         markup : function(o){
370             return createHtml(o);
371         },
372
373 <span id='Ext-DomHelper-method-applyStyles'>        /**
374 </span>         * Applies a style specification to an element.
375          * @param {String/HTMLElement} el The element to apply styles to
376          * @param {String/Object/Function} styles A style specification string e.g. 'width:100px', or object in the form {width:'100px'}, or
377          * a function which returns such a specification.
378          */
379         applyStyles : function(el, styles){
380             if (styles) {
381                 el = Ext.fly(el);
382                 if (typeof styles == &quot;function&quot;) {
383                     styles = styles.call();
384                 }
385                 if (typeof styles == &quot;string&quot;) {
386                     styles = Ext.Element.parseStyles(styles);
387                 }
388                 if (typeof styles == &quot;object&quot;) {
389                     el.setStyle(styles);
390                 }
391             }
392         },
393
394 <span id='Ext-DomHelper-method-insertHtml'>        /**
395 </span>         * Inserts an HTML fragment into the DOM.
396          * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
397          *
398          * For example take the following HTML: `&lt;div&gt;Contents&lt;/div&gt;`
399          *
400          * Using different `where` values inserts element to the following places:
401          *
402          * - beforeBegin: `&lt;HERE&gt;&lt;div&gt;Contents&lt;/div&gt;`
403          * - afterBegin: `&lt;div&gt;&lt;HERE&gt;Contents&lt;/div&gt;`
404          * - beforeEnd: `&lt;div&gt;Contents&lt;HERE&gt;&lt;/div&gt;`
405          * - afterEnd: `&lt;div&gt;Contents&lt;/div&gt;&lt;HERE&gt;`
406          *
407          * @param {HTMLElement/TextNode} el The context element
408          * @param {String} html The HTML fragment
409          * @return {HTMLElement} The new node
410          */
411         insertHtml : function(where, el, html){
412             var hash = {},
413                 hashVal,
414                 range,
415                 rangeEl,
416                 setStart,
417                 frag,
418                 rs;
419
420             where = where.toLowerCase();
421             // add these here because they are used in both branches of the condition.
422             hash[beforebegin] = ['BeforeBegin', 'previousSibling'];
423             hash[afterend] = ['AfterEnd', 'nextSibling'];
424
425             // if IE and context element is an HTMLElement
426             if (el.insertAdjacentHTML) {
427                 if(tableRe.test(el.tagName) &amp;&amp; (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){
428                     return rs;
429                 }
430
431                 // add these two to the hash.
432                 hash[afterbegin] = ['AfterBegin', 'firstChild'];
433                 hash[beforeend] = ['BeforeEnd', 'lastChild'];
434                 if ((hashVal = hash[where])) {
435                     el.insertAdjacentHTML(hashVal[0], html);
436                     return el[hashVal[1]];
437                 }
438             // if (not IE and context element is an HTMLElement) or TextNode
439             } else {
440                 // we cannot insert anything inside a textnode so...
441                 if (Ext.isTextNode(el)) {
442                     where = where === 'afterbegin' ? 'beforebegin' : where;
443                     where = where === 'beforeend' ? 'afterend' : where;
444                 }
445                 range = Ext.supports.CreateContextualFragment ? el.ownerDocument.createRange() : undefined;
446                 setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before');
447                 if (hash[where]) {
448                     if (range) {
449                         range[setStart](el);
450                         frag = range.createContextualFragment(html);
451                     } else {
452                         frag = createContextualFragment(html);
453                     }
454                     el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
455                     return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
456                 } else {
457                     rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
458                     if (el.firstChild) {
459                         if (range) {
460                             range[setStart](el[rangeEl]);
461                             frag = range.createContextualFragment(html);
462                         } else {
463                             frag = createContextualFragment(html);
464                         }
465
466                         if(where == afterbegin){
467                             el.insertBefore(frag, el.firstChild);
468                         }else{
469                             el.appendChild(frag);
470                         }
471                     } else {
472                         el.innerHTML = html;
473                     }
474                     return el[rangeEl];
475                 }
476             }
477             //&lt;debug&gt;
478             Ext.Error.raise({
479                 sourceClass: 'Ext.DomHelper',
480                 sourceMethod: 'insertHtml',
481                 htmlToInsert: html,
482                 targetElement: el,
483                 msg: 'Illegal insertion point reached: &quot;' + where + '&quot;'
484             });
485             //&lt;/debug&gt;
486         },
487
488 <span id='Ext-DomHelper-method-insertBefore'>        /**
489 </span>         * Creates new DOM element(s) and inserts them before el.
490          * @param {String/HTMLElement/Ext.Element} el The context element
491          * @param {Object/String} o The DOM object spec (and children) or raw HTML blob
492          * @param {Boolean} returnElement (optional) true to return a Ext.Element
493          * @return {HTMLElement/Ext.Element} The new node
494          */
495         insertBefore : function(el, o, returnElement){
496             return doInsert(el, o, returnElement, beforebegin);
497         },
498
499 <span id='Ext-DomHelper-method-insertAfter'>        /**
500 </span>         * Creates new DOM element(s) and inserts them after el.
501          * @param {String/HTMLElement/Ext.Element} el The context element
502          * @param {Object} o The DOM object spec (and children)
503          * @param {Boolean} returnElement (optional) true to return a Ext.Element
504          * @return {HTMLElement/Ext.Element} The new node
505          */
506         insertAfter : function(el, o, returnElement){
507             return doInsert(el, o, returnElement, afterend, 'nextSibling');
508         },
509
510 <span id='Ext-DomHelper-method-insertFirst'>        /**
511 </span>         * Creates new DOM element(s) and inserts them as the first child of el.
512          * @param {String/HTMLElement/Ext.Element} el The context element
513          * @param {Object/String} o The DOM object spec (and children) or raw HTML blob
514          * @param {Boolean} returnElement (optional) true to return a Ext.Element
515          * @return {HTMLElement/Ext.Element} The new node
516          */
517         insertFirst : function(el, o, returnElement){
518             return doInsert(el, o, returnElement, afterbegin, 'firstChild');
519         },
520
521 <span id='Ext-DomHelper-method-append'>        /**
522 </span>         * Creates new DOM element(s) and appends them to el.
523          * @param {String/HTMLElement/Ext.Element} el The context element
524          * @param {Object/String} o The DOM object spec (and children) or raw HTML blob
525          * @param {Boolean} returnElement (optional) true to return a Ext.Element
526          * @return {HTMLElement/Ext.Element} The new node
527          */
528         append : function(el, o, returnElement){
529             return doInsert(el, o, returnElement, beforeend, '', true);
530         },
531
532 <span id='Ext-DomHelper-method-overwrite'>        /**
533 </span>         * Creates new DOM element(s) and overwrites the contents of el with them.
534          * @param {String/HTMLElement/Ext.Element} el The context element
535          * @param {Object/String} o The DOM object spec (and children) or raw HTML blob
536          * @param {Boolean} returnElement (optional) true to return a Ext.Element
537          * @return {HTMLElement/Ext.Element} The new node
538          */
539         overwrite : function(el, o, returnElement){
540             el = Ext.getDom(el);
541             el.innerHTML = createHtml(o);
542             return returnElement ? Ext.get(el.firstChild) : el.firstChild;
543         },
544
545         createHtml : createHtml,
546
547 <span id='Ext-DomHelper-method-createDom'>        /**
548 </span>         * Creates new DOM element(s) without inserting them to the document.
549          * @param {Object/String} o The DOM object spec (and children) or raw HTML blob
550          * @return {HTMLElement} The new uninserted node
551          * @method
552          */
553         createDom: createDom,
554
555 <span id='Ext-DomHelper-property-useDom'>        /** True to force the use of DOM instead of html fragments @type Boolean */
556 </span>        useDom : false,
557
558 <span id='Ext-DomHelper-method-createTemplate'>        /**
559 </span>         * Creates a new Ext.Template from the DOM object spec.
560          * @param {Object} o The DOM object spec (and children)
561          * @return {Ext.Template} The new template
562          */
563         createTemplate : function(o){
564             var html = Ext.DomHelper.createHtml(o);
565             return Ext.create('Ext.Template', html);
566         }
567     };
568     return pub;
569 }();
570 </pre>
571 </body>
572 </html>