Initial check-in
[dygraphs.git] / mochikit_v14 / doc / rst / MochiKit / DOM.rst
CommitLineData
6a1aa64f
DV
1.. title:: MochiKit.DOM - painless DOM manipulation API
2
3Name
4====
5
6MochiKit.DOM - painless DOM manipulation API
7
8
9Synopsis
10========
11
12::
13
14 var rows = [
15 ["dataA1", "dataA2", "dataA3"],
16 ["dataB1", "dataB2", "dataB3"]
17 ];
18 row_display = function (row) {
19 return TR(null, map(partial(TD, null), row));
20 }
21 var newTable = TABLE({'class': 'prettytable'},
22 THEAD(null,
23 row_display(["head1", "head2", "head3"])),
24 TFOOT(null,
25 row_display(["foot1", "foot2", "foot3"])),
26 TBODY(null,
27 map(row_display, rows)));
28 // put that in your document.createElement and smoke it!
29 swapDOM(oldTable, newTable);
30
31
32Description
33===========
34
35As you probably know, the DOM APIs are some of the most painful
36Java-inspired APIs you'll run across from a highly dynamic
37language. Don't worry about that though, because they provide a
38reasonable basis to build something that sucks a lot less.
39
40MochiKit.DOM takes much of its inspiration from Nevow's [1]_ stan
41[2]_. This means you choose a tag, give it some attributes, then
42stuff it full of *whatever objects you want*. MochiKit.DOM isn't
43stupid, it knows that a string should be a text node, and that you
44want functions to be called, and that ``Array``-like objects should be
45expanded, and stupid ``null`` values should be skipped.
46
47Hell, it will let you return strings from functions, and use iterators
48from :mochiref:`MochiKit.Iter`. If that's not enough, just teach it
49new tricks with :mochiref:`registerDOMConverter`. If you have never
50used an API like this for creating DOM elements, you've been wasting
51your damn time. Get with it!
52
53
54Dependencies
55============
56
57- :mochiref:`MochiKit.Base`
58- :mochiref:`MochiKit.Style` (optional since MochiKit 1.4 for
59 backwards-compatibility)
60- :mochiref:`MochiKit.Iter` (optional since MochiKit 1.4)
61
62
63Overview
64========
65
66DOM Coercion Rules
67------------------
68
69In order of precedence, :mochiref:`createDOM` coerces given arguments
70to DOM nodes using the following rules:
71
721. Functions are called with a ``this`` and first argument of the
73 parent node and their return value is subject to the following
74 rules (even this one).
752. ``undefined`` and ``null`` are ignored.
763. If :mochiref:`MochiKit.Iter` is loaded, iterables are flattened
77 (as if they were passed in-line as nodes) and each return value is
78 subject to these rules.
794. Values that look like DOM nodes (objects with a ``.nodeType > 0``)
80 are ``.appendChild``'ed to the created DOM fragment.
815. Strings are wrapped up with ``document.createTextNode``
826. Objects that have a ``.dom(node)`` or ``.__dom__(node)`` method
83 are called with the parent node and their result is coerced using
84 these rules. (MochiKit 1.4+).
857. Objects that are not strings are run through the ``domConverters``
86 :mochiref:`MochiKit.Base.AdapterRegistry` (see
87 :mochiref:`registerDOMConverter`). The adapted value is subject
88 to these same rules (e.g. if the adapter returns a string, it
89 will be coerced to a text node).
908. If no adapter is available, ``.toString()`` is used to create a
91 text node.
92
93
94Creating DOM Element Trees
95--------------------------
96
97:mochiref:`createDOM` provides you with an excellent facility for
98creating DOM trees that is easy on the wrists. One of the best ways to
99understand how to use it is to take a look at an example::
100
101 var rows = [
102 ["dataA1", "dataA2", "dataA3"],
103 ["dataB1", "dataB2", "dataB3"]
104 ];
105 row_display = function (row) {
106 return TR(null, map(partial(TD, null), row));
107 }
108 var newTable = TABLE({'class': 'prettytable'},
109 THEAD(null,
110 row_display(["head1", "head2", "head3"])),
111 TFOOT(null,
112 row_display(["foot1", "foot2", "foot3"])),
113 TBODY(null,
114 map(row_display, rows)));
115
116
117This will create a table with the following visual layout (if it were
118inserted into the document DOM):
119
120 +--------+--------+--------+
121 | head1 | head2 | head3 |
122 +========+========+========+
123 | dataA1 | dataA2 | dataA3 |
124 +--------+--------+--------+
125 | dataB1 | dataB2 | dataB3 |
126 +--------+--------+--------+
127 | foot1 | foot2 | foot3 |
128 +--------+--------+--------+
129
130Corresponding to the following HTML::
131
132 <table class="prettytable">
133 <thead>
134 <tr>
135 <td>head1</td>
136 <td>head2</td>
137 <td>head3</td>
138 </tr>
139 </thead>
140 <tfoot>
141 <tr>
142 <td>foot1</td>
143 <td>foot2</td>
144 <td>foot3</td>
145 </tr>
146 </tfoot>
147 <tbody>
148 <tr>
149 <td>dataA1</td>
150 <td>dataA2</td>
151 <td>dataA3</td>
152 </tr>
153 <tr>
154 <td>dataB1</td>
155 <td>dataB2</td>
156 <td>dataB3</td>
157 </tr>
158 </tbody>
159 </table>
160
161
162DOM Context
163-----------
164
165In order to prevent having to pass a ``window`` and/or ``document``
166variable to every MochiKit.DOM function (e.g. when working with a
167child window), MochiKit.DOM maintains a context variable for each of
168them. They are managed with the :mochiref:`withWindow` and
169:mochiref:`withDocument` functions, and can be acquired with
170:mochiref:`currentWindow()` and :mochiref:`currentDocument()`
171
172For example, if you are creating DOM nodes in a child window, you
173could do something like this::
174
175 withWindow(child, function () {
176 var doc = currentDocument();
177 appendChildNodes(doc.body, H1(null, "This is in the child!"));
178 });
179
180Note that :mochiref:`withWindow(win, ...)` also implies
181:mochiref:`withDocument(win.document, ...)`.
182
183
184DOM Gotchas
185-----------
186
187Performance Tradeoff:
188 DOM is much easier to get correct and more flexible than working
189 directly with markup as strings. Modifying ``innerHTML`` is still
190 the fastest way to make document changes.
191
192Internet Explorer:
193 Internet Explorer's DOM implementation is quite poor in comparison
194 to the other popular implementations. In order to avoid memory
195 leaks due to circular references, you should use
196 :mochiref:`MochiKit.Signal.connect` for all of your event handling
197 needs. Additionally, when creating tables with DOM, it is required
198 to use a ``TBODY`` tag (see `Creating DOM Element Trees`_ for an
199 example of this).
200
201
202API Reference
203=============
204
205Functions
206---------
207
208:mochidef:`$(id[, ...])`:
209
210 An alias for :mochiref:`getElement(id[, ...])`
211
212 *Availability*:
213 Available in MochiKit 1.3.1+
214
215
216:mochidef:`addElementClass(element, className)`:
217
218 Ensure that the given ``element`` has ``className`` set as part of
219 its class attribute. This will not disturb other class names.
220 ``element`` is looked up with :mochiref:`getElement`, so string
221 identifiers are also acceptable.
222
223 *Availability*:
224 Available in MochiKit 1.3.1+
225
226
227:mochidef:`addLoadEvent(func)`:
228
229 Note that :mochiref:`addLoadEvent` can not be used in combination
230 with :mochiref:`MochiKit.Signal` if the ``onload`` event is
231 connected. Once an event is connected with
232 :mochiref:`MochiKit.Signal`, no other APIs may be used for that
233 same event.
234
235 This will stack ``window.onload`` functions on top of each other.
236 Each function added will be called after ``onload`` in the order
237 that they were added.
238
239 *Availability*:
240 Available in MochiKit 1.3.1+
241
242
243:mochidef:`addToCallStack(target, path, func[, once])`:
244
245 Note that :mochiref:`addToCallStack` is not compatible with
246 :mochiref:`MochiKit.Signal`. Once an event is connected with
247 :mochiref:`MochiKit.Signal`, no other APIs may be used for that
248 same event.
249
250 Set the property ``path`` of ``target`` to a function that calls
251 the existing function at that property (if any), then calls
252 ``func``.
253
254 If ``target[path]()`` returns exactly ``false``, then ``func``
255 will not be called.
256
257 If ``once`` is ``true``, then ``target[path]`` is set to ``null``
258 after the function call stack has completed.
259
260 If called several times for the same ``target[path]``, it will
261 create a stack of functions (instead of just a pair).
262
263 *Availability*:
264 Available in MochiKit 1.3.1+
265
266
267:mochidef:`appendChildNodes(node[, childNode[, ...]])`:
268
269 Append children to a DOM element using the `DOM Coercion Rules`_.
270
271 ``node``:
272 A reference to the DOM element to add children to (if a string
273 is given, :mochiref:`getElement(node)` will be used to locate
274 the node)
275
276 ``childNode``...:
277 All additional arguments, if any, will be coerced into DOM
278 nodes that are appended as children using the `DOM Coercion
279 Rules`_.
280
281 *returns*:
282 The given DOM element
283
284 *Availability*:
285 Available in MochiKit 1.3.1+
286
287:mochidef:`insertSiblingNodesBefore(node[, siblingNode[, ...]])`:
288
289 Insert children into the DOM structure using the `DOM Coercion
290 Rules`_.
291
292 ``node``:
293 A reference to the DOM element you want to insert children
294 before (if a string is given, :mochiref:`getElement(node)`
295 will be used to locate the node)
296
297 ``siblingNode``...:
298 All additional arguments, if any, will be coerced into DOM
299 nodes that are inserted as siblings using the `DOM Coercion
300 Rules`_.
301
302 *returns*:
303 The parent of the given DOM element
304
305 *Availability*:
306 Available in MochiKit 1.4+
307
308
309:mochidef:`insertSiblingNodesAfter(node[, siblingNode[, ...]])`:
310
311 Insert children into the DOM structure using the `DOM Coercion
312 Rules`_.
313
314 ``node``:
315 A reference to the DOM element you want to insert children
316 after (if a string is given, :mochiref:`getElement(node)`
317 will be used to locate the node)
318
319 ``siblingNode``...:
320 All additional arguments, if any, will be coerced into DOM
321 nodes that are inserted as siblings using the `DOM Coercion
322 Rules`_.
323
324 *returns*:
325 The parent of the given DOM element
326
327 *Availability*:
328 Available in MochiKit 1.4+
329
330
331:mochidef:`createDOM(name[, attrs[, node[, ...]]])`:
332
333 Create a DOM fragment in a really convenient manner, much like
334 Nevow`s [1]_ stan [2]_.
335
336 Partially applied versions of this function for common tags are
337 available as aliases:
338
339 - ``A``
340 - ``BUTTON``
341 - ``BR``
342 - ``CANVAS``
343 - ``DIV``
344 - ``FIELDSET``
345 - ``FORM``
346 - ``H1``
347 - ``H2``
348 - ``H3``
349 - ``HR``
350 - ``IMG``
351 - ``INPUT``
352 - ``LABEL``
353 - ``LEGEND``
354 - ``LI``
355 - ``OL``
356 - ``OPTGROUP``
357 - ``OPTION``
358 - ``P``
359 - ``PRE``
360 - ``SELECT``
361 - ``SPAN``
362 - ``STRONG``
363 - ``TABLE``
364 - ``TBODY``
365 - ``TD``
366 - ``TEXTAREA``
367 - ``TFOOT``
368 - ``TH``
369 - ``THEAD``
370 - ``TR``
371 - ``TT``
372 - ``UL``
373
374 See `Creating DOM Element Trees`_ for a comprehensive example.
375
376 ``name``:
377 The kind of fragment to create (e.g. 'span'), such as you
378 would pass to ``document.createElement``.
379
380 ``attrs``:
381 An object whose properties will be used as the attributes
382 (e.g. ``{'style': 'display:block'}``), or ``null`` if no
383 attributes need to be set.
384
385 See :mochiref:`updateNodeAttributes` for more information.
386
387 For convenience, if ``attrs`` is a string, ``null`` is used
388 and the string will be considered the first ``node``.
389
390 ``node``...:
391 All additional arguments, if any, will be coerced into DOM
392 nodes that are appended as children using the `DOM Coercion
393 Rules`_.
394
395 *returns*:
396 A DOM element
397
398 *Availability*:
399 Available in MochiKit 1.3.1+
400
401
402:mochidef:`createDOMFunc(tag[, attrs[, node[, ...]]])`:
403
404 Convenience function to create a partially applied createDOM
405 function. You'd want to use this if you add additional convenience
406 functions for creating tags, or if you find yourself creating a
407 lot of tags with a bunch of the same attributes or contents.
408
409 See :mochiref:`createDOM` for more detailed descriptions of the
410 arguments.
411
412 ``tag``:
413 The name of the tag
414
415 ``attrs``:
416 Optionally specify the attributes to apply
417
418 ``node``...:
419 Optionally specify any children nodes it should have
420
421 *returns*:
422 function that takes additional arguments and calls
423 :mochiref:`createDOM`
424
425 *Availability*:
426 Available in MochiKit 1.3.1+
427
428
429:mochidef:`currentDocument()`:
430
431 Return the current ``document`` `DOM Context`_. This will always
432 be the same as the global ``document`` unless
433 :mochiref:`withDocument` or :mochiref:`withWindow` is currently
434 executing.
435
436 *Availability*:
437 Available in MochiKit 1.3.1+
438
439
440:mochidef:`currentWindow()`:
441
442 Return the current ``window`` `DOM Context`_. This will always be
443 the same as the global ``window`` unless :mochiref:`withWindow` is
444 currently executing.
445
446 *Availability*:
447 Available in MochiKit 1.3.1+
448
449
450:mochidef:`emitHTML(dom[, lst])`:
451
452 Convert a DOM tree to an ``Array`` of HTML string fragments. This should
453 be used for debugging/testing purposes only.
454
455 The DOM property ``innerHTML`` or ``cloneNode(true)`` method should
456 be used for most purposes.
457
458 *Availability*:
459 Available in MochiKit 1.3.1+
460
461
462:mochidef:`escapeHTML(s)`:
463
464 Make a string safe for HTML, converting the usual suspects (lt,
465 gt, quot, amp)
466
467 *Availability*:
468 Available in MochiKit 1.3.1+
469
470
471:mochidef:`focusOnLoad(element)`:
472
473 Note that :mochiref:`focusOnLoad` can not be used in combination
474 with :mochiref:`MochiKit.Signal` if the ``onload`` event is
475 connected. Once an event is connected with
476 :mochiref:`MochiKit.Signal`, no other APIs may be used for that
477 same event.
478
479 This adds an onload event to focus the given element.
480
481 *Availability*:
482 Available in MochiKit 1.3.1+
483
484
485:mochidef:`formContents(elem=document.body)`:
486
487 Search the DOM tree, starting at ``elem``, for any elements with a
488 ``name`` and ``value`` attribute. Return a 2-element ``Array`` of
489 ``names`` and ``values`` suitable for use with
490 :mochiref:`MochiKit.Base.queryString`.
491
492 *Availability*:
493 Available in MochiKit 1.3.1+
494
495
496:mochidef:`getElement(id[, ...])`:
497
498 A small quick little function to encapsulate the
499 ``getElementById`` method. It includes a check to ensure we can
500 use that method.
501
502 If the id isn't a string, it will be returned as-is.
503
504 Also available as :mochiref:`$(...)` for convenience and
505 compatibility with other JavaScript frameworks.
506
507 If multiple arguments are given, an ``Array`` will be returned.
508
509 *Availability*:
510 Available in MochiKit 1.3.1+
511
512
513:mochidef:`getElementsByTagAndClassName(tagName, className, parent=document)`:
514
515 Returns an array of elements in ``parent`` that match the tag name
516 and class name provided. If ``parent`` is a string, it will be
517 looked up with :mochiref:`getElement`.
518
519 If ``tagName`` is ``null`` or ``"*"``, all elements will be
520 searched for the matching class.
521
522 If ``className`` is ``null``, all elements matching the provided
523 tag are returned.
524
525 *Availability*:
526 Available in MochiKit 1.3.1+
527
528
529:mochidef:`getFirstElementByTagAndClassName(tagName, className, parent=document)`:
530
531 Return the first element in ``parent`` that matches the tag name
532 and class name provided. If ``parent`` is a string, it will be
533 looked up with :mochiref:`getElement`.
534
535 If ``tagName`` is ``null`` or ``"*"``, all elements will be searched
536 for the matching class.
537
538 If ``className`` is ``null``, the first element matching the provided
539 tag will be returned.
540
541 *Availability*:
542 Available in MochiKit 1.4+
543
544
545:mochidef:`getFirstParentByTagAndClassName(elem, tagName='*', className=null)`:
546
547 Returns the first parent of ``elem`` matches the tag name and class name
548 provided. If parent is a string, it will be looked up using
549 :mochiref:`getElement`.
550
551 If ``tagName`` is ``null`` or ``"*"``, all elements will be searched
552 for the matching class.
553
554 If ``className`` is ``null``, the first element matching the provided
555 tag will be returned.
556
557 *Availability*:
558 Available in MochiKit 1.4+
559
560
561:mochidef:`getNodeAttribute(node, attr)`:
562
563 Get the value of the given attribute for a DOM element without
564 ever raising an exception (will return ``null`` on exception).
565
566 ``node``:
567 A reference to the DOM element to update (if a string is
568 given, :mochiref:`getElement(node)` will be used to locate the
569 node)
570
571 ``attr``:
572 The name of the attribute
573
574 Note that it will do the right thing for IE, so don't do
575 the ``class`` -> ``className`` hack yourself.
576
577 *returns*:
578 The attribute's value, or ``null``
579
580 *Availability*:
581 Available in MochiKit 1.3.1+
582
583
584:mochidef:`hasElementClass(element, className[, ...])`:
585
586 Return ``true`` if ``className`` is found on the ``element``.
587 ``element`` is looked up with :mochiref:`getElement`, so string
588 identifiers are also acceptable.
589
590 *Availability*:
591 Available in MochiKit 1.3.1+
592
593
594:mochidef:`isChildNode(node, maybeParent)`:
595
596 Determine whether ``node`` is a child node of ``maybeParent``.
597 Returns ``true`` if so, and ``false`` if not. A node is considered
598 a child node of itself for the purposes of this function.
599
600 If either ``node`` or ``maybeParent`` are strings, the related
601 nodes will be looked up with :mochiref:`getElement`.
602
603 *Availability*:
604 Available in MochiKit 1.4+
605
606
607:mochidef:`isParent(child, element)`:
608
609 Returns ``true`` if ``element`` contains ``child``. Returns ``false``
610 if ``element == child`` or ``child`` is not contained in ``element``.
611 If ``child`` or ``element`` are strings, they will be looked up with
612 :mochiref:`getElement`.
613
614 *Availability*:
615 Available in MochiKit 1.4+
616
617
618:mochidef:`makeClipping(element)`:
619
620 Ensure that ``element.style.overflow = 'hidden'``. If ``element`` is a
621 string, then it will be looked up with :mochiref:`getElement`.
622
623 Returns the original value of ``element.style.overflow``, so that it
624 may be restored with :mochiref:`undoClipping(element, overflow)`.
625
626 *Availability*:
627 Available in MochiKit 1.4+
628
629
630:mochidef:`makePositioned(element)`:
631
632 Ensure that ``element.style.position`` is set to ``"relative"`` if it
633 is not set or is ``"static"``. If ``element`` is a
634 string, then it will be looked up with :mochiref:`getElement`.
635
636 Returns the original value of ``element.style.position``, so that it
637 may be restored with :mochiref:`undoPositioned(element, position)`.
638
639 *Availability*:
640 Available in MochiKit 1.4+
641
642
643:mochidef:`registerDOMConverter(name, check, wrap[, override])`:
644
645 Register an adapter to convert objects that match ``check(obj,
646 ctx)`` to a DOM element, or something that can be converted to a
647 DOM element (i.e. number, bool, string, function, iterable).
648
649 *Availability*:
650 Available in MochiKit 1.3.1+
651
652
653:mochidef:`removeElement(node)`:
654
655 Remove and return ``node`` from a DOM tree.
656
657 ``node``:
658 the DOM element (or string id of one) to be removed
659
660 *returns*
661 The removed element
662
663 *Availability*:
664 Available in MochiKit 1.3.1+
665
666
667:mochidef:`removeElementClass(element, className)`:
668
669 Ensure that the given ``element`` does not have ``className`` set
670 as part of its class attribute. This will not disturb other class
671 names. ``element`` is looked up with :mochiref:`getElement`, so
672 string identifiers are also acceptable.
673
674 *Availability*:
675 Available in MochiKit 1.3.1+
676
677
678:mochidef:`removeEmptyTextNodes(node)`:
679
680 Remove all text node children that contain only whitespace from
681 ``node``. Useful in situations where such empty text nodes can
682 interfere with DOM traversal.
683
684 ``node``:
685 the DOM element (or string id of one) to remove whitespace child
686 nodes from.
687
688 *Availability*:
689 Available in MochiKit 1.4+
690
691
692:mochidef:`replaceChildNodes(node[, childNode[, ...]])`:
693
694 Remove all children from the given DOM element, then append any
695 given childNodes to it (by calling :mochiref:`appendChildNodes`).
696
697 ``node``:
698 A reference to the DOM element to add children to (if a string
699 is given, :mochiref:`getElement(node)` will be used to locate
700 the node)
701
702 ``childNode``...:
703 All additional arguments, if any, will be coerced into DOM
704 nodes that are appended as children using the `DOM Coercion
705 Rules`_.
706
707 *returns*:
708 The given DOM element
709
710 *Availability*:
711 Available in MochiKit 1.3.1+
712
713
714:mochidef:`scrapeText(node[, asArray=false])`:
715
716 Walk a DOM tree in-order and scrape all of the text out of it as a
717 ``string``.
718
719 If ``asArray`` is ``true``, then an ``Array`` will be returned
720 with each individual text node. These two are equivalent::
721
722 assert( scrapeText(node) == scrapeText(node, true).join("") );
723
724 *Availability*:
725 Available in MochiKit 1.3.1+
726
727
728:mochidef:`setElementClass(element, className)`:
729
730 Set the entire class attribute of ``element`` to ``className``.
731 ``element`` is looked up with :mochiref:`getElement`, so string
732 identifiers are also acceptable.
733
734 *Availability*:
735 Available in MochiKit 1.3.1+
736
737
738:mochidef:`setNodeAttribute(node, attr, value)`:
739
740 Set the value of the given attribute for a DOM element without
741 ever raising an exception (will return null on exception). If
742 setting more than one attribute, you should use
743 :mochiref:`updateNodeAttributes`.
744
745 ``node``:
746 A reference to the DOM element to update (if a string is
747 given, :mochiref:`getElement(node)` will be used to locate the
748 node)
749
750 ``attr``:
751 The name of the attribute
752
753 Note that it will do the right thing for IE, so don't do the
754 ``class`` -> ``className`` hack yourself.
755
756 ``value``:
757 The value of the attribute, may be an object to be merged
758 (e.g. for setting style).
759
760 *returns*:
761 The given DOM element or ``null`` on failure
762
763 *Availability*:
764 Available in MochiKit 1.3.1+
765
766
767:mochidef:`swapDOM(dest, src)`:
768
769 Replace ``dest`` in a DOM tree with ``src``, returning ``src``.
770
771 ``dest``:
772 a DOM element (or string id of one) to be replaced
773
774 ``src``:
775 the DOM element (or string id of one) to replace it with, or
776 ``null`` if ``dest`` is to be removed (replaced with nothing).
777
778 *returns*:
779 a DOM element (``src``)
780
781 *Availability*:
782 Available in MochiKit 1.3.1+
783
784
785:mochidef:`swapElementClass(element, fromClass, toClass)`:
786
787 If ``fromClass`` is set on ``element``, replace it with
788 ``toClass``. This will not disturb other classes on that element.
789 ``element`` is looked up with :mochiref:`getElement`, so string
790 identifiers are also acceptable.
791
792 *Availability*:
793 Available in MochiKit 1.3.1+
794
795
796:mochidef:`toggleElementClass(className[, element[, ...]])`:
797
798 Toggle the presence of a given ``className`` in the class
799 attribute of all given elements. All elements will be looked up
800 with :mochiref:`getElement`, so string identifiers are acceptable.
801
802 *Availability*:
803 Available in MochiKit 1.3.1+
804
805
806:mochidef:`toHTML(dom)`:
807
808 Convert a DOM tree to a HTML string using :mochiref:`emitHTML`.
809 This should be used for debugging/testing purposes only.
810
811 The DOM property ``innerHTML`` or ``cloneNode(true)`` method should
812 be used for most purposes.
813
814 *Availability*:
815 Available in MochiKit 1.3.1+
816
817
818:mochidef:`undoClipping(element, overflow)`:
819
820 Restore the setting of ``element.style.overflow`` set by
821 :mochiref:`makeClipping(element)`. If ``element`` is a string, then
822 it will be looked up with :mochiref:`getElement`.
823
824 *Availability*:
825 Available in MochiKit 1.4+
826
827
828:mochidef:`undoPositioned(element, overflow)`:
829
830 Restore the setting of ``element.style.position`` set by
831 :mochiref:`makePositioned(element)`. If ``element`` is a string, then
832 it will be looked up with :mochiref:`getElement`.
833
834 *Availability*:
835 Available in MochiKit 1.4+
836
837
838:mochidef:`updateNodeAttributes(node, attrs)`:
839
840 Update the attributes of a DOM element from a given object.
841
842 ``node``:
843 A reference to the DOM element to update (if a string is
844 given, :mochiref:`getElement(node)` will be used to locate the
845 node)
846
847 ``attrs``:
848 An object whose properties will be used to set the attributes
849 (e.g. ``{'class': 'invisible'}``), or ``null`` if no
850 attributes need to be set. If an object is given for the
851 attribute value (e.g. ``{'style': {'display': 'block'}}``)
852 then :mochiref:`MochiKit.Base.updatetree` will be used to set
853 that attribute.
854
855 Note that it will do the right thing for IE, so don't do the
856 ``class`` -> ``className`` hack yourself, and it deals with
857 setting "on..." event handlers correctly.
858
859 *returns*:
860 The given DOM element
861
862 *Availability*:
863 Available in MochiKit 1.3.1+
864
865
866:mochidef:`withWindow(win, func)`:
867
868 Call ``func`` with the ``window`` `DOM Context`_ set to ``win``
869 and the ``document`` `DOM Context`_ set to ``win.document``. When
870 ``func()`` returns or throws an error, the `DOM Context`_ will be
871 restored to its previous state.
872
873 The return value of ``func()`` is returned by this function.
874
875 *Availability*:
876 Available in MochiKit 1.3.1+
877
878
879:mochidef:`withDocument(doc, func)`:
880
881 Call ``func`` with the ``doc`` `DOM Context`_ set to ``doc``.
882 When ``func()`` returns or throws an error, the `DOM Context`_
883 will be restored to its previous state.
884
885 The return value of ``func()`` is returned by this function.
886
887 *Availability*:
888 Available in MochiKit 1.3.1+
889
890
891Style Functions
892---------------
893
894These functions are available in MochiKit 1.3.1, but have been moved to
895:mochiref:`MochiKit.Style` in 1.4+.
896
897
898:mochidef:`computedStyle(htmlElement, cssProperty, mozillaEquivalentCSS)`:
899
900 Looks up a CSS property for the given element. The element can be
901 specified as either a string with the element's ID or the element
902 object itself.
903
904 ``cssProperty``:
905 MochiKit 1.3.1 expects camel case, e.g. ``backgroundColor``.
906 MochiKit 1.4+ expects CSS selector case, e.g. ``background-color``,
907 but will accept camel case for backwards-compatibility.
908
909 ``mozillaEquivalentCSS``:
910 MochiKit 1.3.1 expects selector case.
911 MochiKit 1.4+ ignores this argument.
912
913 *Availability*:
914 Available in MochiKit 1.3.1, deprecated in favor of
915 :mochiref:`MochiKit.Style.getStyle` in 1.4+
916
917
918:mochidef:`elementDimensions(element)`:
919
920 Return the absolute pixel width and height (including padding and border,
921 but not margins) of ``element`` as an object with ``w`` and ``h``
922 properties, or ``undefined`` if ``element`` is not in the document.
923 ``element`` may be specified as a string to be looked up with
924 :mochiref:`getElement`, a DOM element, or trivially as an object with
925 ``w`` and/or ``h`` properties.
926
927 *Availability*:
928 Available in MochiKit 1.3.1, deprecated in favor of
929 :mochiref:`MochiKit.Style.getElementDimensions` in 1.4+
930
931
932:mochidef:`elementPosition(element[, relativeTo={x: 0, y: 0}])`:
933
934 Return the absolute pixel position of ``element`` in the document
935 as an object with ``x`` and ``y`` properties, or ``undefined`` if
936 ``element`` is not in the document. ``element`` may be specified
937 as a string to be looked up with :mochiref:`getElement`, a DOM
938 element, or trivially as an object with ``x`` and/or ``y``
939 properties.
940
941 If ``relativeTo`` is given, then its coordinates are subtracted from
942 the absolute position of ``element``, e.g.::
943
944 var elemPos = elementPosition(elem);
945 var anotherElemPos = elementPosition(anotherElem);
946 var relPos = elementPosition(elem, anotherElem);
947 assert( relPos.x == (elemPos.x - anotherElemPos.x) );
948 assert( relPos.y == (elemPos.y - anotherElemPos.y) );
949
950 ``relativeTo`` may be specified as a string to be looked up with
951 :mochiref:`getElement`, a DOM element, or trivially as an object
952 with ``x`` and/or ``y`` properties.
953
954 *Availability*:
955 Available in MochiKit 1.3.1, deprecated in favor of
956 :mochiref:`MochiKit.Style.getElementPosition` in 1.4+
957
958
959:mochidef:`getViewportDimensions()`:
960
961 Return the pixel width and height of the viewport as an object
962 with ``w`` and ``h`` properties. ``element`` is looked up with
963 :mochiref:`getElement`, so string identifiers are also acceptable.
964
965 *Availability*:
966 Available in MochiKit 1.3.1, moved to
967 :mochiref:`MochiKit.Style.getViewportDimensions` in 1.4+
968
969
970:mochidef:`hideElement(element, ...)`:
971
972 Partial form of :mochiref:`setDisplayForElement`, specifically::
973
974 partial(setDisplayForElement, "none")
975
976 For information about the caveats of using a ``style.display``
977 based show/hide mechanism, and a CSS based alternative, see
978 `Element Visibility`_.
979
980.. _`Element Visibility`: Style.html#element-visibility
981
982 *Availability*:
983 Available in MochiKit 1.3.1, moved to
984 :mochiref:`MochiKit.Style.hideElement` in 1.4+
985
986
987:mochidef:`setElementDimensions(element, dimensions[, units='px'])`:
988
989 Sets the dimensions of ``element`` in the document from an object
990 with ``w`` and ``h`` properties.
991
992 ``node``:
993 A reference to the DOM element to update (if a string is
994 given, :mochiref:`getElement(node)` will be used to locate the
995 node)
996
997 ``dimensions``:
998 An object with ``w`` and ``h`` properties
999
1000 ``units``:
1001 Optionally set the units to use, default is ``px``
1002
1003 *Availability*:
1004 Available in MochiKit 1.3.1, moved to
1005 :mochiref:`MochiKit.Style.setElementDimensions` in 1.4+
1006
1007
1008:mochidef:`setElementPosition(element, position[, units='px'])`:
1009
1010 Sets the absolute position of ``element`` in the document from an
1011 object with ``x`` and ``y`` properties.
1012
1013 ``node``:
1014 A reference to the DOM element to update (if a string is
1015 given, :mochiref:`getElement(node)` will be used to locate the
1016 node)
1017
1018 ``position``:
1019 An object with ``x`` and ``y`` properties
1020
1021 ``units``:
1022 Optionally set the units to use, default is ``px``
1023
1024 *Availability*:
1025 Available in MochiKit 1.3.1, moved to
1026 :mochiref:`MochiKit.Style.setElementPosition` in 1.4+
1027
1028
1029:mochidef:`setDisplayForElement(display, element[, ...])`:
1030
1031 Change the ``style.display`` for the given element(s). Usually
1032 used as the partial forms:
1033
1034 - :mochiref:`showElement(element, ...)`
1035 - :mochiref:`hideElement(element, ...)`
1036
1037 Elements are looked up with :mochiref:`getElement`, so string
1038 identifiers are acceptable.
1039
1040 For information about the caveats of using a ``style.display``
1041 based show/hide mechanism, and a CSS based alternative, see
1042 `Element Visibility`_.
1043
1044 *Availability*:
1045 Available in MochiKit 1.3.1, moved to
1046 :mochiref:`MochiKit.Style.setDisplayForElement` in 1.4+
1047
1048
1049:mochidef:`setOpacity(element, opacity)`:
1050
1051 Sets ``opacity`` for ``element``. Valid ``opacity`` values range
1052 from 0 (invisible) to 1 (opaque). ``element`` is looked up with
1053 :mochiref:`getElement`, so string identifiers are also acceptable.
1054
1055 *Availability*:
1056 Available in MochiKit 1.3.1, moved to
1057 :mochiref:`MochiKit.Style.setOpacity` in 1.4+
1058
1059
1060:mochidef:`showElement(element, ...)`:
1061
1062 Partial form of :mochiref:`setDisplayForElement`, specifically::
1063
1064 partial(setDisplayForElement, "block")
1065
1066 For information about the caveats of using a ``style.display``
1067 based show/hide mechanism, and a CSS based alternative, see
1068 `Element Visibility`_.
1069
1070 *Availability*:
1071 Available in MochiKit 1.3.1, moved to
1072 :mochiref:`MochiKit.Style.showElement` in 1.4+
1073
1074
1075Style Objects
1076-------------
1077
1078These objects are available in MochiKit 1.3.1, but have been moved to
1079:mochiref:`MochiKit.Style` in 1.4+.
1080
1081:mochidef:`Coordinates(x, y)`:
1082
1083 Constructs an object with ``x`` and ``y`` properties. ``obj.toString()``
1084 returns something like ``{x: 0, y: 42}`` for debugging.
1085
1086 *Availability*:
1087 Available in MochiKit 1.3.1, moved to
1088 :mochiref:`MochiKit.Style.Coordinates` in 1.4+
1089
1090:mochidef:`Dimensions(w, h)`:
1091
1092 Constructs an object with ``w`` and ``h`` properties. ``obj.toString()``
1093 returns something like ``{w: 0, h: 42}`` for debugging.
1094
1095 *Availability*:
1096 Available in MochiKit 1.3.1, moved to
1097 :mochiref:`MochiKit.Style.Dimensions` in 1.4+
1098
1099
1100
1101See Also
1102========
1103
1104.. [1] Nevow, a web application construction kit for Python:
1105 http://divmod.org/trac/wiki/DivmodNevow
1106.. [2] nevow.stan is a domain specific language for Python (read as
1107 "crazy getitem/call overloading abuse") that Donovan and I
1108 schemed up at PyCon 2003 at this super ninja Python/C++
1109 programmer's (David Abrahams) hotel room. Donovan later
1110 inflicted this upon the masses in Nevow. Check out the Nevow
1111 Guide for some examples:
1112 http://divmod.org/trac/wiki/DivmodNevow
1113
1114
1115Authors
1116=======
1117
1118- Bob Ippolito <bob@redivi.com>
1119
1120
1121Copyright
1122=========
1123
1124Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is
1125dual-licensed free software; you can redistribute it and/or modify it
1126under the terms of the `MIT License`_ or the `Academic Free License
1127v2.1`_.
1128
1129.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php
1130.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php