Selectable: Proper handling of inner scrolling

Fixes #13359
Closes gh-1570
This commit is contained in:
Alexey Balchunas 2015-07-01 21:45:54 +03:00 committed by Jörn Zaefferer
parent 2e770153c5
commit a240251b36

View File

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