]> source.dussan.org Git - jquery-ui.git/commitdiff
Selectable: Proper handling of inner scrolling
authorAlexey Balchunas <bleshik@gmail.com>
Wed, 1 Jul 2015 18:45:54 +0000 (21:45 +0300)
committerJörn Zaefferer <joern.zaefferer@gmail.com>
Thu, 21 Apr 2016 14:11:37 +0000 (16:11 +0200)
Fixes #13359
Closes gh-1570

ui/widgets/selectable.js

index de7c59faf5a8ae9ff0d6cdc3bdea917e69eb4971..ed980cc493ebe25586cbcba7da8394828cc930cf 100644 (file)
@@ -57,11 +57,16 @@ return $.widget( "ui.selectable", $.ui.mouse, {
 
                // Cache selectee children based on filter
                this.refresh = function() {
+                       that.elementPos = $( that.element[ 0 ] ).offset();
                        that.selectees = $( that.options.filter, that.element[ 0 ] );
                        that._addClass( that.selectees, "ui-selectee" );
                        that.selectees.each( function() {
                                var $this = $( this ),
-                                       pos = $this.offset();
+                                       selecteeOffset = $this.offset(),
+                                       pos = {
+                                               left: selecteeOffset.left - that.elementPos.left,
+                                               top: selecteeOffset.top - that.elementPos.top
+                                       };
                                $.data( this, "selectable-item", {
                                        element: this,
                                        $element: $this,
@@ -94,6 +99,7 @@ return $.widget( "ui.selectable", $.ui.mouse, {
                        options = this.options;
 
                this.opos = [ event.pageX, event.pageY ];
+               this.elementPos = $( this.element[ 0 ] ).offset();
 
                if ( this.options.disabled ) {
                        return;
@@ -183,19 +189,25 @@ return $.widget( "ui.selectable", $.ui.mouse, {
 
                this.selectees.each( function() {
                        var selectee = $.data( this, "selectable-item" ),
-                               hit = false;
+                               hit = false,
+                               offset = {};
 
                        //prevent helper from being selected if appendTo: selectable
                        if ( !selectee || selectee.element === that.element[ 0 ] ) {
                                return;
                        }
 
+                       offset.left   = selectee.left   + that.elementPos.left;
+                       offset.right  = selectee.right  + that.elementPos.left;
+                       offset.top    = selectee.top    + that.elementPos.top;
+                       offset.bottom = selectee.bottom + that.elementPos.top;
+
                        if ( options.tolerance === "touch" ) {
-                               hit = ( !( selectee.left > x2 || selectee.right < x1 || selectee.top > y2 ||
-                                       selectee.bottom < y1 ) );
+                               hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
+                    offset.bottom < y1 ) );
                        } else if ( options.tolerance === "fit" ) {
-                               hit = ( selectee.left > x1 && selectee.right < x2 && selectee.top > y1 &&
-                                       selectee.bottom < y2 );
+                               hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
+                    offset.bottom < y2 );
                        }
 
                        if ( hit ) {