Ticket #4631: draggable-4631.diff

File draggable-4631.diff, 4.5 KB (added by alexch, 12 years ago)

revised patch for draggable.js

  • ui.draggable.js

    old new  
    292292
    293293                if(!pos) pos = this.position;
    294294                var mod = d == "absolute" ? 1 : -1;
    295                 var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
     295                var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent;
    296296
    297297                return {
    298298                        top: (
    299299                                pos.top                                                                                                                                 // The absolute mouse position
    300300                                + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
    301301                                + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
    302                                 - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
     302                                - (this._extraY(scroll) * mod)
    303303                        ),
    304304                        left: (
    305305                                pos.left                                                                                                                                // The absolute mouse position
    306306                                + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
    307307                                + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
    308                                 - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
     308                                - (this._extraX(scroll) * mod)
    309309                        )
    310310                };
    311311
     
    313313
    314314        _generatePosition: function(event) {
    315315
    316                 var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
     316                var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent;
    317317
    318318                // This is another very weird special case that only happens for relative elements:
    319319                // 1. If the css position is relative
     
    356356                                - this.offset.click.top                                                                                                 // Click offset (relative to the element)
    357357                                - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
    358358                                - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
    359                                 + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
     359                                + this._extraY(scroll)
    360360                        ),
    361361                        left: (
    362362                                pageX                                                                                                                           // The absolute mouse position
    363363                                - this.offset.click.left                                                                                                // Click offset (relative to the element)
    364364                                - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
    365365                                - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
    366                                 + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
     366                                + this._extraX(scroll)
    367367                        )
    368368                };
    369369
    370370        },
    371371
     372        _extraY: function(scroll) {
     373          scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
     374          if (this._needsSafariFixedWorkaround())
     375            return 0;
     376          else if (this.cssPosition == 'fixed')
     377            return -this.scrollParent.scrollTop();
     378          else if (scrollIsRootNode)
     379            return 0;
     380          else
     381            return scroll.scrollTop();
     382        },
     383       
     384        _extraX: function(scroll) {
     385          scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
     386    if (this._needsSafariFixedWorkaround())
     387      return 0;
     388    else if (this.cssPosition == 'fixed')
     389      return -this.scrollParent.scrollLeft();
     390    else if (scrollIsRootNode)
     391      return 0;
     392    else
     393      return scroll.scrollLeft();
     394        },
     395       
     396        _needsSafariFixedWorkaround: function() {
     397          return $.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed';
     398        },
     399       
    372400        _clear: function() {
    373401                this.helper.removeClass("ui-draggable-dragging");
    374402                if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();