Skip to content

Commit

Permalink
Merge pull request #5644 from select2/GH-5584
Browse files Browse the repository at this point in the history
Fixes jQuery migrate error when getting offset when dropdownParent not in document
  • Loading branch information
kevin-brown committed Sep 19, 2019
2 parents 233424d + 31931a4 commit 7c4131b
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
9 changes: 8 additions & 1 deletion src/js/select2/dropdown/attachBody.js
Expand Up @@ -190,7 +190,14 @@ define([
$offsetParent = $offsetParent.offsetParent();
}

var parentOffset = $offsetParent.offset();
var parentOffset = {
top: 0,
left: 0
};

if ($.contains(document.body, $offsetParent[0])) {
parentOffset = $offsetParent.offset();
}

css.top -= parentOffset.top;
css.left -= parentOffset.left;
Expand Down
51 changes: 50 additions & 1 deletion tests/dropdown/positioning-tests.js
Expand Up @@ -174,4 +174,53 @@ test('dropdown is positioned down with absolute offsets', function (assert) {
'0px',
'There should not be an extra left offset'
);
});
});

test('dropdown is positioned even when not in document', function (assert) {
var $ = require('jquery');
var $select = $('<select></select>');

var $container = $('<span>test</span>');
var container = new MockContainer();

var Utils = require('select2/utils');
var Options = require('select2/options');

var Dropdown = require('select2/dropdown');
var AttachBody = require('select2/dropdown/attachBody');

var DropdownAdapter = Utils.Decorate(Dropdown, AttachBody);

var dropdown = new DropdownAdapter($select, new Options({
dropdownParent: $('html')
}));

var $dropdown = dropdown.render();

assert.equal(
$dropdown[0].style.top,
0,
'The drodpown should not have any offset before it is displayed'
);

dropdown.bind(container, $container);
dropdown.position($dropdown, $container);
dropdown._showDropdown();

assert.ok(
dropdown.$dropdown.hasClass('select2-dropdown--below'),
'The dropdown should be forced down'
);

assert.equal(
$dropdown.css('top'),
'0px',
'The offset should be 0px at the top'
);

assert.equal(
$dropdown.css('left'),
'0px',
'The offset should be 0px on the left'
);
});

0 comments on commit 7c4131b

Please sign in to comment.