1 | define(["./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 | }); |
---|