source: Dev/trunk/src/client/dojo/_base/html.js @ 532

Last change on this file since 532 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 14.4 KB
Line 
1define(["./kernel", "../dom", "../dom-style", "../dom-attr", "../dom-prop", "../dom-class", "../dom-construct", "../dom-geometry"], function(dojo, dom, style, attr, prop, cls, ctr, geom){
2        // module:
3        //              dojo/dom
4
5        /*=====
6        return {
7                // summary:
8                //              This module is a stub for the core dojo DOM API.
9        };
10        =====*/
11
12        // mix-in dom
13        dojo.byId = dom.byId;
14        dojo.isDescendant = dom.isDescendant;
15        dojo.setSelectable = dom.setSelectable;
16
17        // mix-in dom-attr
18        dojo.getAttr = attr.get;
19        dojo.setAttr = attr.set;
20        dojo.hasAttr = attr.has;
21        dojo.removeAttr = attr.remove;
22        dojo.getNodeProp = attr.getNodeProp;
23
24        dojo.attr = function(node, name, value){
25                // summary:
26                //              Gets or sets an attribute on an HTML element.
27                // description:
28                //              Handles normalized getting and setting of attributes on DOM
29                //              Nodes. If 2 arguments are passed, and a the second argument is a
30                //              string, acts as a getter.
31                //
32                //              If a third argument is passed, or if the second argument is a
33                //              map of attributes, acts as a setter.
34                //
35                //              When passing functions as values, note that they will not be
36                //              directly assigned to slots on the node, but rather the default
37                //              behavior will be removed and the new behavior will be added
38                //              using `dojo.connect()`, meaning that event handler properties
39                //              will be normalized and that some caveats with regards to
40                //              non-standard behaviors for onsubmit apply. Namely that you
41                //              should cancel form submission using `dojo.stopEvent()` on the
42                //              passed event object instead of returning a boolean value from
43                //              the handler itself.
44                // node: DOMNode|String
45                //              id or reference to the element to get or set the attribute on
46                // name: String|Object
47                //              the name of the attribute to get or set.
48                // value: String?
49                //              The value to set for the attribute
50                // returns:
51                //              when used as a getter, the value of the requested attribute
52                //              or null if that attribute does not have a specified or
53                //              default value;
54                //
55                //              when used as a setter, the DOM node
56                //
57                // example:
58                //      |       // get the current value of the "foo" attribute on a node
59                //      |       dojo.attr(dojo.byId("nodeId"), "foo");
60                //      |       // or we can just pass the id:
61                //      |       dojo.attr("nodeId", "foo");
62                //
63                // example:
64                //      |       // use attr() to set the tab index
65                //      |       dojo.attr("nodeId", "tabIndex", 3);
66                //      |
67                //
68                // example:
69                //      Set multiple values at once, including event handlers:
70                //      |       dojo.attr("formId", {
71                //      |               "foo": "bar",
72                //      |               "tabIndex": -1,
73                //      |               "method": "POST",
74                //      |               "onsubmit": function(e){
75                //      |                       // stop submitting the form. Note that the IE behavior
76                //      |                       // of returning true or false will have no effect here
77                //      |                       // since our handler is connect()ed to the built-in
78                //      |                       // onsubmit behavior and so we need to use
79                //      |                       // dojo.stopEvent() to ensure that the submission
80                //      |                       // doesn't proceed.
81                //      |                       dojo.stopEvent(e);
82                //      |
83                //      |                       // submit the form with Ajax
84                //      |                       dojo.xhrPost({ form: "formId" });
85                //      |               }
86                //      |       });
87                //
88                // example:
89                //      Style is s special case: Only set with an object hash of styles
90                //      |       dojo.attr("someNode",{
91                //      |               id:"bar",
92                //      |               style:{
93                //      |                       width:"200px", height:"100px", color:"#000"
94                //      |               }
95                //      |       });
96                //
97                // example:
98                //      Again, only set style as an object hash of styles:
99                //      |       var obj = { color:"#fff", backgroundColor:"#000" };
100                //      |       dojo.attr("someNode", "style", obj);
101                //      |
102                //      |       // though shorter to use `dojo.style()` in this case:
103                //      |       dojo.style("someNode", obj);
104
105                if(arguments.length == 2){
106                        return attr[typeof name == "string" ? "get" : "set"](node, name);
107                }
108                return attr.set(node, name, value);
109        };
110
111        // mix-in dom-class
112        dojo.hasClass = cls.contains;
113        dojo.addClass = cls.add;
114        dojo.removeClass = cls.remove;
115        dojo.toggleClass = cls.toggle;
116        dojo.replaceClass = cls.replace;
117
118        // mix-in dom-construct
119        dojo._toDom = dojo.toDom = ctr.toDom;
120        dojo.place = ctr.place;
121        dojo.create = ctr.create;
122        dojo.empty = function(node){ ctr.empty(node); };
123        dojo._destroyElement = dojo.destroy = function(node){ ctr.destroy(node); };
124
125        // mix-in dom-geometry
126        dojo._getPadExtents = dojo.getPadExtents = geom.getPadExtents;
127        dojo._getBorderExtents = dojo.getBorderExtents = geom.getBorderExtents;
128        dojo._getPadBorderExtents = dojo.getPadBorderExtents = geom.getPadBorderExtents;
129        dojo._getMarginExtents = dojo.getMarginExtents = geom.getMarginExtents;
130        dojo._getMarginSize = dojo.getMarginSize = geom.getMarginSize;
131        dojo._getMarginBox = dojo.getMarginBox = geom.getMarginBox;
132        dojo.setMarginBox = geom.setMarginBox;
133        dojo._getContentBox = dojo.getContentBox = geom.getContentBox;
134        dojo.setContentSize = geom.setContentSize;
135        dojo._isBodyLtr = dojo.isBodyLtr = geom.isBodyLtr;
136        dojo._docScroll = dojo.docScroll = geom.docScroll;
137        dojo._getIeDocumentElementOffset = dojo.getIeDocumentElementOffset = geom.getIeDocumentElementOffset;
138        dojo._fixIeBiDiScrollLeft = dojo.fixIeBiDiScrollLeft = geom.fixIeBiDiScrollLeft;
139        dojo.position = geom.position;
140
141        dojo.marginBox = function marginBox(/*DomNode|String*/node, /*Object?*/box){
142                // summary:
143                //              Getter/setter for the margin-box of node.
144                // description:
145                //              Getter/setter for the margin-box of node.
146                //              Returns an object in the expected format of box (regardless
147                //              if box is passed). The object might look like:
148                //              `{ l: 50, t: 200, w: 300: h: 150 }`
149                //              for a node offset from its parent 50px to the left, 200px from
150                //              the top with a margin width of 300px and a margin-height of
151                //              150px.
152                // node:
153                //              id or reference to DOM Node to get/set box for
154                // box:
155                //              If passed, denotes that dojo.marginBox() should
156                //              update/set the margin box for node. Box is an object in the
157                //              above format. All properties are optional if passed.
158                // example:
159                //              Retrieve the margin box of a passed node
160                //      |       var box = dojo.marginBox("someNodeId");
161                //      |       console.dir(box);
162                //
163                // example:
164                //              Set a node's margin box to the size of another node
165                //      |       var box = dojo.marginBox("someNodeId");
166                //      |       dojo.marginBox("someOtherNode", box);
167                return box ? geom.setMarginBox(node, box) : geom.getMarginBox(node); // Object
168        };
169
170        dojo.contentBox = function contentBox(/*DomNode|String*/node, /*Object?*/box){
171                // summary:
172                //              Getter/setter for the content-box of node.
173                // description:
174                //              Returns an object in the expected format of box (regardless if box is passed).
175                //              The object might look like:
176                //              `{ l: 50, t: 200, w: 300: h: 150 }`
177                //              for a node offset from its parent 50px to the left, 200px from
178                //              the top with a content width of 300px and a content-height of
179                //              150px. Note that the content box may have a much larger border
180                //              or margin box, depending on the box model currently in use and
181                //              CSS values set/inherited for node.
182                //              While the getter will return top and left values, the
183                //              setter only accepts setting the width and height.
184                // node:
185                //              id or reference to DOM Node to get/set box for
186                // box:
187                //              If passed, denotes that dojo.contentBox() should
188                //              update/set the content box for node. Box is an object in the
189                //              above format, but only w (width) and h (height) are supported.
190                //              All properties are optional if passed.
191                return box ? geom.setContentSize(node, box) : geom.getContentBox(node); // Object
192        };
193
194        dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
195                // summary:
196                //              Deprecated: Use position() for border-box x/y/w/h
197                //              or marginBox() for margin-box w/h/l/t.
198                //
199                //              Returns an object that measures margin-box (w)idth/(h)eight
200                //              and absolute position x/y of the border-box. Also returned
201                //              is computed (l)eft and (t)op values in pixels from the
202                //              node's offsetParent as returned from marginBox().
203                //              Return value will be in the form:
204                //|                     { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }
205                //              Does not act as a setter. If includeScroll is passed, the x and
206                //              y params are affected as one would expect in dojo.position().
207                dojo.deprecated("dojo.coords()", "Use dojo.position() or dojo.marginBox().");
208                node = dom.byId(node);
209                var s = style.getComputedStyle(node), mb = geom.getMarginBox(node, s);
210                var abs = geom.position(node, includeScroll);
211                mb.x = abs.x;
212                mb.y = abs.y;
213                return mb;      // Object
214        };
215
216        // mix-in dom-prop
217        dojo.getProp = prop.get;
218        dojo.setProp = prop.set;
219
220        dojo.prop = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){
221                // summary:
222                //              Gets or sets a property on an HTML element.
223                // description:
224                //              Handles normalized getting and setting of properties on DOM
225                //              Nodes. If 2 arguments are passed, and a the second argument is a
226                //              string, acts as a getter.
227                //
228                //              If a third argument is passed, or if the second argument is a
229                //              map of attributes, acts as a setter.
230                //
231                //              When passing functions as values, note that they will not be
232                //              directly assigned to slots on the node, but rather the default
233                //              behavior will be removed and the new behavior will be added
234                //              using `dojo.connect()`, meaning that event handler properties
235                //              will be normalized and that some caveats with regards to
236                //              non-standard behaviors for onsubmit apply. Namely that you
237                //              should cancel form submission using `dojo.stopEvent()` on the
238                //              passed event object instead of returning a boolean value from
239                //              the handler itself.
240                // node:
241                //              id or reference to the element to get or set the property on
242                // name:
243                //              the name of the property to get or set.
244                // value:
245                //              The value to set for the property
246                // returns:
247                //              when used as a getter, the value of the requested property
248                //              or null if that attribute does not have a specified or
249                //              default value;
250                //
251                //              when used as a setter, the DOM node
252                //
253                // example:
254                //      |       // get the current value of the "foo" property on a node
255                //      |       dojo.prop(dojo.byId("nodeId"), "foo");
256                //      |       // or we can just pass the id:
257                //      |       dojo.prop("nodeId", "foo");
258                //
259                // example:
260                //      |       // use prop() to set the tab index
261                //      |       dojo.prop("nodeId", "tabIndex", 3);
262                //      |
263                //
264                // example:
265                //      Set multiple values at once, including event handlers:
266                //      |       dojo.prop("formId", {
267                //      |               "foo": "bar",
268                //      |               "tabIndex": -1,
269                //      |               "method": "POST",
270                //      |               "onsubmit": function(e){
271                //      |                       // stop submitting the form. Note that the IE behavior
272                //      |                       // of returning true or false will have no effect here
273                //      |                       // since our handler is connect()ed to the built-in
274                //      |                       // onsubmit behavior and so we need to use
275                //      |                       // dojo.stopEvent() to ensure that the submission
276                //      |                       // doesn't proceed.
277                //      |                       dojo.stopEvent(e);
278                //      |
279                //      |                       // submit the form with Ajax
280                //      |                       dojo.xhrPost({ form: "formId" });
281                //      |               }
282                //      |       });
283                //
284                // example:
285                //              Style is s special case: Only set with an object hash of styles
286                //      |       dojo.prop("someNode",{
287                //      |               id:"bar",
288                //      |               style:{
289                //      |                       width:"200px", height:"100px", color:"#000"
290                //      |               }
291                //      |       });
292                //
293                // example:
294                //              Again, only set style as an object hash of styles:
295                //      |       var obj = { color:"#fff", backgroundColor:"#000" };
296                //      |       dojo.prop("someNode", "style", obj);
297                //      |
298                //      |       // though shorter to use `dojo.style()` in this case:
299                //      |       dojo.style("someNode", obj);
300
301                if(arguments.length == 2){
302                        return prop[typeof name == "string" ? "get" : "set"](node, name);
303                }
304                // setter
305                return prop.set(node, name, value);
306        };
307
308        // mix-in dom-style
309        dojo.getStyle = style.get;
310        dojo.setStyle = style.set;
311        dojo.getComputedStyle = style.getComputedStyle;
312        dojo.__toPixelValue = dojo.toPixelValue = style.toPixelValue;
313
314        dojo.style = function(node, name, value){
315                // summary:
316                //              Accesses styles on a node. If 2 arguments are
317                //              passed, acts as a getter. If 3 arguments are passed, acts
318                //              as a setter.
319                // description:
320                //              Getting the style value uses the computed style for the node, so the value
321                //              will be a calculated value, not just the immediate node.style value.
322                //              Also when getting values, use specific style names,
323                //              like "borderBottomWidth" instead of "border" since compound values like
324                //              "border" are not necessarily reflected as expected.
325                //              If you want to get node dimensions, use `dojo.marginBox()`,
326                //              `dojo.contentBox()` or `dojo.position()`.
327                // node: DOMNode|String
328                //              id or reference to node to get/set style for
329                // name: String|Object?
330                //              the style property to set in DOM-accessor format
331                //              ("borderWidth", not "border-width") or an object with key/value
332                //              pairs suitable for setting each property.
333                // value: String?
334                //              If passed, sets value on the node for style, handling
335                //              cross-browser concerns.  When setting a pixel value,
336                //              be sure to include "px" in the value. For instance, top: "200px".
337                //              Otherwise, in some cases, some browsers will not apply the style.
338                // returns:
339                //              when used as a getter, return the computed style of the node if passing in an ID or node,
340                //              or return the normalized, computed value for the property when passing in a node and a style property
341                // example:
342                //              Passing only an ID or node returns the computed style object of
343                //              the node:
344                //      |       dojo.style("thinger");
345                // example:
346                //              Passing a node and a style property returns the current
347                //              normalized, computed value for that property:
348                //      |       dojo.style("thinger", "opacity"); // 1 by default
349                //
350                // example:
351                //              Passing a node, a style property, and a value changes the
352                //              current display of the node and returns the new computed value
353                //      |       dojo.style("thinger", "opacity", 0.5); // == 0.5
354                //
355                // example:
356                //              Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
357                //      |       dojo.style("thinger", {
358                //      |               "opacity": 0.5,
359                //      |               "border": "3px solid black",
360                //      |               "height": "300px"
361                //      |       });
362                //
363                // example:
364                //              When the CSS style property is hyphenated, the JavaScript property is camelCased.
365                //              font-size becomes fontSize, and so on.
366                //      |       dojo.style("thinger",{
367                //      |               fontSize:"14pt",
368                //      |               letterSpacing:"1.2em"
369                //      |       });
370                //
371                // example:
372                //              dojo/NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
373                //              dojo.style() on every element of the list. See: `dojo/query` and `dojo/NodeList`
374                //      |       dojo.query(".someClassName").style("visibility","hidden");
375                //      |       // or
376                //      |       dojo.query("#baz > div").style({
377                //      |               opacity:0.75,
378                //      |               fontSize:"13pt"
379                //      |       });
380
381                switch(arguments.length){
382                        case 1:
383                                return style.get(node);
384                        case 2:
385                                return style[typeof name == "string" ? "get" : "set"](node, name);
386                }
387                // setter
388                return style.set(node, name, value);
389        };
390
391        return dojo;
392});
Note: See TracBrowser for help on using the repository browser.