Changeset 372 for ruby/trunk/public/javascripts/dragdrop.js
- Timestamp:
- Dec 10, 2009, 6:17:17 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ruby/trunk/public/javascripts/dragdrop.js
r164 r372 1 1 // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 // (c) 2005-200 7Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)3 // 2 // (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) 3 // 4 4 // script.aculo.us is freely distributable under the terms of an MIT-style license. 5 5 // For details, see the script.aculo.us web site: http://script.aculo.us/ … … 33 33 } 34 34 } 35 35 36 36 if(options.accept) options.accept = [options.accept].flatten(); 37 37 … … 41 41 this.drops.push(options); 42 42 }, 43 43 44 44 findDeepestChild: function(drops) { 45 45 deepest = drops[0]; 46 46 47 47 for (i = 1; i < drops.length; ++i) 48 48 if (Element.isParent(drops[i].element, deepest.element)) 49 49 deepest = drops[i]; 50 50 51 51 return deepest; 52 52 }, … … 55 55 var containmentNode; 56 56 if(drop.tree) { 57 containmentNode = element.treeNode; 57 containmentNode = element.treeNode; 58 58 } else { 59 59 containmentNode = element.parentNode; … … 61 61 return drop._containers.detect(function(c) { return containmentNode == c }); 62 62 }, 63 63 64 64 isAffected: function(point, element, drop) { 65 65 return ( … … 68 68 this.isContained(element, drop)) && 69 69 ((!drop.accept) || 70 (Element.classNames(element).detect( 70 (Element.classNames(element).detect( 71 71 function(v) { return drop.accept.include(v) } ) )) && 72 72 Position.within(drop.element, point[0], point[1]) ); … … 88 88 if(!this.drops.length) return; 89 89 var drop, affected = []; 90 90 91 91 this.drops.each( function(drop) { 92 92 if(Droppables.isAffected(point, element, drop)) 93 93 affected.push(drop); 94 94 }); 95 95 96 96 if(affected.length>0) 97 97 drop = Droppables.findDeepestChild(affected); … … 102 102 if(drop.onHover) 103 103 drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); 104 104 105 105 if (drop != this.last_active) Droppables.activate(drop); 106 106 } … … 113 113 if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) 114 114 if (this.last_active.onDrop) { 115 this.last_active.onDrop(element, this.last_active.element, event); 116 return true; 115 this.last_active.onDrop(element, this.last_active.element, event); 116 return true; 117 117 } 118 118 }, … … 122 122 this.deactivate(this.last_active); 123 123 } 124 } 124 }; 125 125 126 126 var Draggables = { 127 127 drags: [], 128 128 observers: [], 129 129 130 130 register: function(draggable) { 131 131 if(this.drags.length == 0) { … … 133 133 this.eventMouseMove = this.updateDrag.bindAsEventListener(this); 134 134 this.eventKeypress = this.keyPress.bindAsEventListener(this); 135 135 136 136 Event.observe(document, "mouseup", this.eventMouseUp); 137 137 Event.observe(document, "mousemove", this.eventMouseMove); … … 140 140 this.drags.push(draggable); 141 141 }, 142 142 143 143 unregister: function(draggable) { 144 144 this.drags = this.drags.reject(function(d) { return d==draggable }); … … 149 149 } 150 150 }, 151 151 152 152 activate: function(draggable) { 153 if(draggable.options.delay) { 154 this._timeout = setTimeout(function() { 155 Draggables._timeout = null; 156 window.focus(); 157 Draggables.activeDraggable = draggable; 158 }.bind(this), draggable.options.delay); 153 if(draggable.options.delay) { 154 this._timeout = setTimeout(function() { 155 Draggables._timeout = null; 156 window.focus(); 157 Draggables.activeDraggable = draggable; 158 }.bind(this), draggable.options.delay); 159 159 } else { 160 160 window.focus(); // allows keypress events if window isn't currently focused, fails for Safari … … 162 162 } 163 163 }, 164 164 165 165 deactivate: function() { 166 166 this.activeDraggable = null; 167 167 }, 168 168 169 169 updateDrag: function(event) { 170 170 if(!this.activeDraggable) return; … … 174 174 if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; 175 175 this._lastPointer = pointer; 176 176 177 177 this.activeDraggable.updateDrag(event, pointer); 178 178 }, 179 179 180 180 endDrag: function(event) { 181 if(this._timeout) { 182 clearTimeout(this._timeout); 183 this._timeout = null; 181 if(this._timeout) { 182 clearTimeout(this._timeout); 183 this._timeout = null; 184 184 } 185 185 if(!this.activeDraggable) return; … … 188 188 this.activeDraggable = null; 189 189 }, 190 190 191 191 keyPress: function(event) { 192 192 if(this.activeDraggable) 193 193 this.activeDraggable.keyPress(event); 194 194 }, 195 195 196 196 addObserver: function(observer) { 197 197 this.observers.push(observer); 198 198 this._cacheObserverCallbacks(); 199 199 }, 200 200 201 201 removeObserver: function(element) { // element instead of observer fixes mem leaks 202 202 this.observers = this.observers.reject( function(o) { return o.element==element }); 203 203 this._cacheObserverCallbacks(); 204 204 }, 205 205 206 206 notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' 207 207 if(this[eventName+'Count'] > 0) … … 211 211 if(draggable.options[eventName]) draggable.options[eventName](draggable, event); 212 212 }, 213 213 214 214 _cacheObserverCallbacks: function() { 215 215 ['onStart','onEnd','onDrag'].each( function(eventName) { … … 219 219 }); 220 220 } 221 } 221 }; 222 222 223 223 /*--------------------------------------------------------------------------*/ … … 235 235 endeffect: function(element) { 236 236 var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; 237 new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 237 new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 238 238 queue: {scope:'_draggable', position:'end'}, 239 afterFinish: function(){ 240 Draggable._dragging[element] = false 239 afterFinish: function(){ 240 Draggable._dragging[element] = false 241 241 } 242 }); 242 }); 243 243 }, 244 244 zindex: 1000, … … 251 251 delay: 0 252 252 }; 253 253 254 254 if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) 255 255 Object.extend(defaults, { … … 257 257 element._opacity = Element.getOpacity(element); 258 258 Draggable._dragging[element] = true; 259 new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 259 new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 260 260 } 261 261 }); 262 262 263 263 var options = Object.extend(defaults, arguments[1] || { }); 264 264 265 265 this.element = $(element); 266 266 267 267 if(options.handle && Object.isString(options.handle)) 268 268 this.handle = this.element.down('.'+options.handle, 0); 269 269 270 270 if(!this.handle) this.handle = $(options.handle); 271 271 if(!this.handle) this.handle = this.element; 272 272 273 273 if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { 274 274 options.scroll = $(options.scroll); … … 276 276 } 277 277 278 Element.makePositioned(this.element); // fix IE 278 Element.makePositioned(this.element); // fix IE 279 279 280 280 this.options = options; 281 this.dragging = false; 281 this.dragging = false; 282 282 283 283 this.eventMouseDown = this.initDrag.bindAsEventListener(this); 284 284 Event.observe(this.handle, "mousedown", this.eventMouseDown); 285 285 286 286 Draggables.register(this); 287 287 }, 288 288 289 289 destroy: function() { 290 290 Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); 291 291 Draggables.unregister(this); 292 292 }, 293 293 294 294 currentDelta: function() { 295 295 return([ … … 297 297 parseInt(Element.getStyle(this.element,'top') || '0')]); 298 298 }, 299 299 300 300 initDrag: function(event) { 301 301 if(!Object.isUndefined(Draggable._dragging[this.element]) && 302 302 Draggable._dragging[this.element]) return; 303 if(Event.isLeftClick(event)) { 303 if(Event.isLeftClick(event)) { 304 304 // abort on form elements, fixes a Firefox issue 305 305 var src = Event.element(event); … … 310 310 tag_name=='BUTTON' || 311 311 tag_name=='TEXTAREA')) return; 312 312 313 313 var pointer = [Event.pointerX(event), Event.pointerY(event)]; 314 314 var pos = Position.cumulativeOffset(this.element); 315 315 this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); 316 316 317 317 Draggables.activate(this); 318 318 Event.stop(event); 319 319 } 320 320 }, 321 321 322 322 startDrag: function(event) { 323 323 this.dragging = true; 324 324 if(!this.delta) 325 325 this.delta = this.currentDelta(); 326 326 327 327 if(this.options.zindex) { 328 328 this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); 329 329 this.element.style.zIndex = this.options.zindex; 330 330 } 331 331 332 332 if(this.options.ghosting) { 333 333 this._clone = this.element.cloneNode(true); 334 this. element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');335 if (!this. element._originallyAbsolute)334 this._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); 335 if (!this._originallyAbsolute) 336 336 Position.absolutize(this.element); 337 337 this.element.parentNode.insertBefore(this._clone, this.element); 338 338 } 339 339 340 340 if(this.options.scroll) { 341 341 if (this.options.scroll == window) { … … 348 348 } 349 349 } 350 350 351 351 Draggables.notify('onStart', this, event); 352 352 353 353 if(this.options.starteffect) this.options.starteffect(this.element); 354 354 }, 355 355 356 356 updateDrag: function(event, pointer) { 357 357 if(!this.dragging) this.startDrag(event); 358 358 359 359 if(!this.options.quiet){ 360 360 Position.prepare(); 361 361 Droppables.show(pointer, this.element); 362 362 } 363 363 364 364 Draggables.notify('onDrag', this, event); 365 365 366 366 this.draw(pointer); 367 367 if(this.options.change) this.options.change(this); 368 368 369 369 if(this.options.scroll) { 370 370 this.stopScrolling(); 371 371 372 372 var p; 373 373 if (this.options.scroll == window) { … … 387 387 this.startScrolling(speed); 388 388 } 389 389 390 390 // fix AppleWebKit rendering 391 391 if(Prototype.Browser.WebKit) window.scrollBy(0,0); 392 392 393 393 Event.stop(event); 394 394 }, 395 395 396 396 finishDrag: function(event, success) { 397 397 this.dragging = false; 398 398 399 399 if(this.options.quiet){ 400 400 Position.prepare(); … … 404 404 405 405 if(this.options.ghosting) { 406 if (!this. element._originallyAbsolute)406 if (!this._originallyAbsolute) 407 407 Position.relativize(this.element); 408 delete this. element._originallyAbsolute;408 delete this._originallyAbsolute; 409 409 Element.remove(this._clone); 410 410 this._clone = null; 411 411 } 412 412 413 var dropped = false; 414 if(success) { 415 dropped = Droppables.fire(event, this.element); 416 if (!dropped) dropped = false; 413 var dropped = false; 414 if(success) { 415 dropped = Droppables.fire(event, this.element); 416 if (!dropped) dropped = false; 417 417 } 418 418 if(dropped && this.options.onDropped) this.options.onDropped(this.element); … … 421 421 var revert = this.options.revert; 422 422 if(revert && Object.isFunction(revert)) revert = revert(this.element); 423 423 424 424 var d = this.currentDelta(); 425 425 if(revert && this.options.reverteffect) { … … 434 434 this.element.style.zIndex = this.originalZ; 435 435 436 if(this.options.endeffect) 436 if(this.options.endeffect) 437 437 this.options.endeffect(this.element); 438 438 439 439 Draggables.deactivate(this); 440 440 Droppables.reset(); 441 441 }, 442 442 443 443 keyPress: function(event) { 444 444 if(event.keyCode!=Event.KEY_ESC) return; … … 446 446 Event.stop(event); 447 447 }, 448 448 449 449 endDrag: function(event) { 450 450 if(!this.dragging) return; … … 453 453 Event.stop(event); 454 454 }, 455 455 456 456 draw: function(point) { 457 457 var pos = Position.cumulativeOffset(this.element); … … 460 460 pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; 461 461 } 462 462 463 463 var d = this.currentDelta(); 464 464 pos[0] -= d[0]; pos[1] -= d[1]; 465 465 466 466 if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { 467 467 pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 468 468 pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; 469 469 } 470 471 var p = [0,1].map(function(i){ 472 return (point[i]-pos[i]-this.offset[i]) 470 471 var p = [0,1].map(function(i){ 472 return (point[i]-pos[i]-this.offset[i]) 473 473 }.bind(this)); 474 474 475 475 if(this.options.snap) { 476 476 if(Object.isFunction(this.options.snap)) { … … 479 479 if(Object.isArray(this.options.snap)) { 480 480 p = p.map( function(v, i) { 481 return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)) 481 return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)); 482 482 } else { 483 483 p = p.map( function(v) { 484 return (v/this.options.snap).round()*this.options.snap }.bind(this)) 484 return (v/this.options.snap).round()*this.options.snap }.bind(this)); 485 485 } 486 486 }} 487 487 488 488 var style = this.element.style; 489 489 if((!this.options.constraint) || (this.options.constraint=='horizontal')) … … 491 491 if((!this.options.constraint) || (this.options.constraint=='vertical')) 492 492 style.top = p[1] + "px"; 493 493 494 494 if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering 495 495 }, 496 496 497 497 stopScrolling: function() { 498 498 if(this.scrollInterval) { … … 502 502 } 503 503 }, 504 504 505 505 startScrolling: function(speed) { 506 506 if(!(speed[0] || speed[1])) return; … … 509 509 this.scrollInterval = setInterval(this.scroll.bind(this), 10); 510 510 }, 511 511 512 512 scroll: function() { 513 513 var current = new Date(); … … 525 525 this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; 526 526 } 527 527 528 528 Position.prepare(); 529 529 Droppables.show(Draggables._lastPointer, this.element); … … 539 539 this.draw(Draggables._lastScrollPointer); 540 540 } 541 541 542 542 if(this.options.change) this.options.change(this); 543 543 }, 544 544 545 545 _getWindowScroll: function(w) { 546 546 var T, L, W, H; … … 561 561 } else { 562 562 W = body.offsetWidth; 563 H = body.offsetHeight 563 H = body.offsetHeight; 564 564 } 565 565 } … … 578 578 this.lastValue = Sortable.serialize(this.element); 579 579 }, 580 580 581 581 onStart: function() { 582 582 this.lastValue = Sortable.serialize(this.element); 583 583 }, 584 584 585 585 onEnd: function() { 586 586 Sortable.unmark(); … … 592 592 var Sortable = { 593 593 SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, 594 594 595 595 sortables: { }, 596 596 597 597 _findRootElement: function(element) { 598 while (element.tagName.toUpperCase() != "BODY") { 598 while (element.tagName.toUpperCase() != "BODY") { 599 599 if(element.id && Sortable.sortables[element.id]) return element; 600 600 element = element.parentNode; … … 607 607 return Sortable.sortables[element.id]; 608 608 }, 609 609 610 610 destroy: function(element){ 611 var s = Sortable.options(element); 612 611 element = $(element); 612 var s = Sortable.sortables[element.id]; 613 613 614 if(s) { 614 615 Draggables.removeObserver(s.element); 615 616 s.droppables.each(function(d){ Droppables.remove(d) }); 616 617 s.draggables.invoke('destroy'); 617 618 618 619 delete Sortable.sortables[s.element.id]; 619 620 } … … 622 623 create: function(element) { 623 624 element = $(element); 624 var options = Object.extend({ 625 var options = Object.extend({ 625 626 element: element, 626 627 tag: 'li', // assumes li children, override with tag: 'tagname' … … 636 637 hoverclass: null, 637 638 ghosting: false, 638 quiet: false, 639 quiet: false, 639 640 scroll: false, 640 641 scrollSensitivity: 20, 641 642 scrollSpeed: 15, 642 643 format: this.SERIALIZE_RULE, 643 644 // these take arrays of elements or ids and can be 644 645 // these take arrays of elements or ids and can be 645 646 // used for better initialization performance 646 647 elements: false, 647 648 handles: false, 648 649 649 650 onChange: Prototype.emptyFunction, 650 651 onUpdate: Prototype.emptyFunction … … 683 684 options_for_draggable.zindex = options.zindex; 684 685 685 // build options for the droppables 686 // build options for the droppables 686 687 var options_for_droppable = { 687 688 overlap: options.overlap, … … 690 691 hoverclass: options.hoverclass, 691 692 onHover: Sortable.onHover 692 } 693 693 }; 694 694 695 var options_for_tree = { 695 696 onHover: Sortable.onEmptyHover, … … 697 698 containment: options.containment, 698 699 hoverclass: options.hoverclass 699 } 700 }; 700 701 701 702 // fix for gecko engine 702 Element.cleanWhitespace(element); 703 Element.cleanWhitespace(element); 703 704 704 705 options.draggables = []; … … 713 714 (options.elements || this.findElements(element, options) || []).each( function(e,i) { 714 715 var handle = options.handles ? $(options.handles[i]) : 715 (options.handle ? $(e).select('.' + options.handle)[0] : e); 716 (options.handle ? $(e).select('.' + options.handle)[0] : e); 716 717 options.draggables.push( 717 718 new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); 718 719 Droppables.add(e, options_for_droppable); 719 720 if(options.tree) e.treeNode = element; 720 options.droppables.push(e); 721 options.droppables.push(e); 721 722 }); 722 723 723 724 if(options.tree) { 724 725 (Sortable.findTreeElements(element, options) || []).each( function(e) { … … 742 743 element, options.only, options.tree ? true : false, options.tag); 743 744 }, 744 745 745 746 findTreeElements: function(element, options) { 746 747 return Element.findChildren( … … 759 760 element.style.visibility = "hidden"; // fix gecko rendering 760 761 dropon.parentNode.insertBefore(element, dropon); 761 if(dropon.parentNode!=oldParentNode) 762 if(dropon.parentNode!=oldParentNode) 762 763 Sortable.options(oldParentNode).onChange(element); 763 764 Sortable.options(dropon.parentNode).onChange(element); … … 770 771 element.style.visibility = "hidden"; // fix gecko rendering 771 772 dropon.parentNode.insertBefore(element, nextElement); 772 if(dropon.parentNode!=oldParentNode) 773 if(dropon.parentNode!=oldParentNode) 773 774 Sortable.options(oldParentNode).onChange(element); 774 775 Sortable.options(dropon.parentNode).onChange(element); … … 776 777 } 777 778 }, 778 779 779 780 onEmptyHover: function(element, dropon, overlap) { 780 781 var oldParentNode = element.parentNode; 781 782 var droponOptions = Sortable.options(dropon); 782 783 783 784 if(!Element.isParent(dropon, element)) { 784 785 var index; 785 786 786 787 var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); 787 788 var child = null; 788 789 789 790 if(children) { 790 791 var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); 791 792 792 793 for (index = 0; index < children.length; index += 1) { 793 794 if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { … … 802 803 } 803 804 } 804 805 805 806 dropon.insertBefore(element, child); 806 807 807 808 Sortable.options(oldParentNode).onChange(element); 808 809 droponOptions.onChange(element); … … 817 818 // mark on ghosting only 818 819 var sortable = Sortable.options(dropon.parentNode); 819 if(sortable && !sortable.ghosting) return; 820 if(sortable && !sortable.ghosting) return; 820 821 821 822 if(!Sortable._marker) { 822 Sortable._marker = 823 Sortable._marker = 823 824 ($('dropmarker') || Element.extend(document.createElement('DIV'))). 824 825 hide().addClassName('dropmarker').setStyle({position:'absolute'}); 825 826 document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); 826 } 827 } 827 828 var offsets = Position.cumulativeOffset(dropon); 828 829 Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); 829 830 830 831 if(position=='after') 831 if(sortable.overlap == 'horizontal') 832 if(sortable.overlap == 'horizontal') 832 833 Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); 833 834 else 834 835 Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); 835 836 836 837 Sortable._marker.show(); 837 838 }, 838 839 839 840 _tree: function(element, options, parent) { 840 841 var children = Sortable.findElements(element, options) || []; 841 842 842 843 for (var i = 0; i < children.length; ++i) { 843 844 var match = children[i].id.match(options.format); 844 845 845 846 if (!match) continue; 846 847 847 848 var child = { 848 849 id: encodeURIComponent(match ? match[1] : null), … … 852 853 position: parent.children.length, 853 854 container: $(children[i]).down(options.treeTag) 854 } 855 855 }; 856 856 857 /* Get the element containing the children and recurse over it */ 857 858 if (child.container) 858 this._tree(child.container, options, child) 859 859 this._tree(child.container, options, child); 860 860 861 parent.children.push (child); 861 862 } 862 863 863 return parent; 864 return parent; 864 865 }, 865 866 … … 874 875 format: sortableOptions.format 875 876 }, arguments[1] || { }); 876 877 877 878 var root = { 878 879 id: null, … … 881 882 container: element, 882 883 position: 0 883 } 884 884 }; 885 885 886 return Sortable._tree(element, options, root); 886 887 }, … … 898 899 element = $(element); 899 900 var options = Object.extend(this.options(element), arguments[1] || { }); 900 901 901 902 return $(this.findElements(element, options) || []).map( function(item) { 902 903 return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; … … 907 908 element = $(element); 908 909 var options = Object.extend(this.options(element), arguments[2] || { }); 909 910 910 911 var nodeMap = { }; 911 912 this.findElements(element, options).each( function(n) { … … 914 915 n.parentNode.removeChild(n); 915 916 }); 916 917 917 918 new_sequence.each(function(ident) { 918 919 var n = nodeMap[ident]; … … 923 924 }); 924 925 }, 925 926 926 927 serialize: function(element) { 927 928 element = $(element); … … 929 930 var name = encodeURIComponent( 930 931 (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); 931 932 932 933 if (options.tree) { 933 934 return Sortable.tree(element, arguments[1]).children.map( function (item) { 934 return [name + Sortable._constructIndex(item) + "[id]=" + 935 return [name + Sortable._constructIndex(item) + "[id]=" + 935 936 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); 936 937 }).flatten().join('&'); … … 941 942 } 942 943 } 943 } 944 }; 944 945 945 946 // Returns true if child is contained within element … … 948 949 if (child.parentNode == element) return true; 949 950 return Element.isParent(child.parentNode, element); 950 } 951 952 Element.findChildren = function(element, only, recursive, tagName) { 951 }; 952 953 Element.findChildren = function(element, only, recursive, tagName) { 953 954 if(!element.hasChildNodes()) return null; 954 955 tagName = tagName.toUpperCase(); … … 966 967 967 968 return (elements.length>0 ? elements.flatten() : []); 968 } 969 }; 969 970 970 971 Element.offsetSize = function (element, type) { 971 972 return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; 972 } 973 };
Note:
See TracChangeset
for help on using the changeset viewer.