Upgrade to ExtJS 3.1.0 - Released 12/16/2009
[extjs.git] / docs / source / Element-more.html
1 <html>\r
2 <head>\r
3   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    \r
4   <title>The source code</title>\r
5     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
6     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
7 </head>\r
8 <body  onload="prettyPrint();">\r
9     <pre class="prettyprint lang-js">/**
10  * @class Ext.Element
11  */
12 Ext.Element.addMethods({
13     <div id="method-Ext.Element-swallowEvent"></div>/**
14      * Stops the specified event(s) from bubbling and optionally prevents the default action
15      * @param {String/Array} eventName an event / array of events to stop from bubbling
16      * @param {Boolean} preventDefault (optional) true to prevent the default action too
17      * @return {Ext.Element} this
18      */
19     swallowEvent : function(eventName, preventDefault){
20         var me = this;
21         function fn(e){
22             e.stopPropagation();
23             if(preventDefault){
24                 e.preventDefault();
25             }
26         }
27         if(Ext.isArray(eventName)){
28             Ext.each(eventName, function(e) {
29                  me.on(e, fn);
30             });
31             return me;
32         }
33         me.on(eventName, fn);
34         return me;
35     },
36
37     <div id="method-Ext.Element-relayEvent"></div>/**
38      * Create an event handler on this element such that when the event fires and is handled by this element,
39      * it will be relayed to another object (i.e., fired again as if it originated from that object instead).
40      * @param {String} eventName The type of event to relay
41      * @param {Object} object Any object that extends {@link Ext.util.Observable} that will provide the context
42      * for firing the relayed event
43      */
44     relayEvent : function(eventName, observable){
45         this.on(eventName, function(e){
46             observable.fireEvent(eventName, e);
47         });
48     },
49
50     <div id="method-Ext.Element-clean"></div>/**
51      * Removes worthless text nodes
52      * @param {Boolean} forceReclean (optional) By default the element
53      * keeps track if it has been cleaned already so
54      * you can call this over and over. However, if you update the element and
55      * need to force a reclean, you can pass true.
56      */
57     clean : function(forceReclean){
58         var me = this,
59             dom = me.dom,
60             n = dom.firstChild,
61             ni = -1;
62
63         if(Ext.Element.data(dom, 'isCleaned') && forceReclean !== true){
64             return me;
65         }
66
67         while(n){
68             var nx = n.nextSibling;
69             if(n.nodeType == 3 && !/\S/.test(n.nodeValue)){
70                 dom.removeChild(n);
71             }else{
72                 n.nodeIndex = ++ni;
73             }
74             n = nx;
75         }
76         Ext.Element.data(dom, 'isCleaned', true);
77         return me;
78     },
79
80     <div id="method-Ext.Element-load"></div>/**
81      * Direct access to the Updater {@link Ext.Updater#update} method. The method takes the same object
82      * parameter as {@link Ext.Updater#update}
83      * @return {Ext.Element} this
84      */
85     load : function(){
86         var um = this.getUpdater();
87         um.update.apply(um, arguments);
88         return this;
89     },
90
91     <div id="method-Ext.Element-getUpdater"></div>/**
92     * Gets this element's {@link Ext.Updater Updater}
93     * @return {Ext.Updater} The Updater
94     */
95     getUpdater : function(){
96         return this.updateManager || (this.updateManager = new Ext.Updater(this));
97     },
98
99     <div id="method-Ext.Element-update"></div>/**
100     * Update the innerHTML of this element, optionally searching for and processing scripts
101     * @param {String} html The new HTML
102     * @param {Boolean} loadScripts (optional) True to look for and process scripts (defaults to false)
103     * @param {Function} callback (optional) For async script loading you can be notified when the update completes
104     * @return {Ext.Element} this
105      */
106     update : function(html, loadScripts, callback){
107         if (!this.dom) {
108             return this;
109         }
110         html = html || "";
111
112         if(loadScripts !== true){
113             this.dom.innerHTML = html;
114             if(Ext.isFunction(callback)){
115                 callback();
116             }
117             return this;
118         }
119
120         var id = Ext.id(),
121             dom = this.dom;
122
123         html += '<span id="' + id + '"></span>';
124
125         Ext.lib.Event.onAvailable(id, function(){
126             var DOC = document,
127                 hd = DOC.getElementsByTagName("head")[0],
128                 re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,
129                 srcRe = /\ssrc=([\'\"])(.*?)\1/i,
130                 typeRe = /\stype=([\'\"])(.*?)\1/i,
131                 match,
132                 attrs,
133                 srcMatch,
134                 typeMatch,
135                 el,
136                 s;
137
138             while((match = re.exec(html))){
139                 attrs = match[1];
140                 srcMatch = attrs ? attrs.match(srcRe) : false;
141                 if(srcMatch && srcMatch[2]){
142                    s = DOC.createElement("script");
143                    s.src = srcMatch[2];
144                    typeMatch = attrs.match(typeRe);
145                    if(typeMatch && typeMatch[2]){
146                        s.type = typeMatch[2];
147                    }
148                    hd.appendChild(s);
149                 }else if(match[2] && match[2].length > 0){
150                     if(window.execScript) {
151                        window.execScript(match[2]);
152                     } else {
153                        window.eval(match[2]);
154                     }
155                 }
156             }
157             el = DOC.getElementById(id);
158             if(el){Ext.removeNode(el);}
159             if(Ext.isFunction(callback)){
160                 callback();
161             }
162         });
163         dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
164         return this;
165     },
166
167     // inherit docs, overridden so we can add removeAnchor
168     removeAllListeners : function(){
169         this.removeAnchor();
170         Ext.EventManager.removeAll(this.dom);
171         return this;
172     },
173
174     <div id="method-Ext.Element-createProxy"></div>/**
175      * Creates a proxy element of this element
176      * @param {String/Object} config The class name of the proxy element or a DomHelper config object
177      * @param {String/HTMLElement} renderTo (optional) The element or element id to render the proxy to (defaults to document.body)
178      * @param {Boolean} matchBox (optional) True to align and size the proxy to this element now (defaults to false)
179      * @return {Ext.Element} The new proxy element
180      */
181     createProxy : function(config, renderTo, matchBox){
182         config = Ext.isObject(config) ? config : {tag : "div", cls: config};
183
184         var me = this,
185             proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
186                                Ext.DomHelper.insertBefore(me.dom, config, true);
187
188         if(matchBox && me.setBox && me.getBox){ // check to make sure Element.position.js is loaded
189            proxy.setBox(me.getBox());
190         }
191         return proxy;
192     }
193 });
194
195 Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
196 </pre>    \r
197 </body>\r
198 </html>