Fixed bug #4014
This commit is contained in:
parent
07aa8a45b0
commit
54e126a664
@ -3,8 +3,9 @@ define([
|
|||||||
'jquery-mousewheel',
|
'jquery-mousewheel',
|
||||||
|
|
||||||
'./select2/core',
|
'./select2/core',
|
||||||
'./select2/defaults'
|
'./select2/defaults',
|
||||||
], function ($, _, Select2, Defaults) {
|
'./select2/utils'
|
||||||
|
], function ($, _, Select2, Defaults, Utils) {
|
||||||
if ($.fn.select2 == null) {
|
if ($.fn.select2 == null) {
|
||||||
// All methods that should return the element
|
// All methods that should return the element
|
||||||
var thisMethods = ['open', 'close', 'destroy'];
|
var thisMethods = ['open', 'close', 'destroy'];
|
||||||
@ -25,7 +26,7 @@ define([
|
|||||||
var args = Array.prototype.slice.call(arguments, 1);
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
|
||||||
this.each(function () {
|
this.each(function () {
|
||||||
var instance = $(this).data('select2');
|
var instance = Utils.GetData(this, 'select2');
|
||||||
|
|
||||||
if (instance == null && window.console && console.error) {
|
if (instance == null && window.console && console.error) {
|
||||||
console.error(
|
console.error(
|
||||||
|
15
src/js/select2/core.js
vendored
15
src/js/select2/core.js
vendored
@ -5,8 +5,8 @@ define([
|
|||||||
'./keys'
|
'./keys'
|
||||||
], function ($, Options, Utils, KEYS) {
|
], function ($, Options, Utils, KEYS) {
|
||||||
var Select2 = function ($element, options) {
|
var Select2 = function ($element, options) {
|
||||||
if ($element.data('select2') != null) {
|
if (Utils.GetData($element[0], 'select2') != null) {
|
||||||
$element.data('select2').destroy();
|
Utils.GetData($element[0], 'select2').destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$element = $element;
|
this.$element = $element;
|
||||||
@ -22,7 +22,7 @@ define([
|
|||||||
// Set up the tabindex
|
// Set up the tabindex
|
||||||
|
|
||||||
var tabindex = $element.attr('tabindex') || 0;
|
var tabindex = $element.attr('tabindex') || 0;
|
||||||
$element.data('old-tabindex', tabindex);
|
Utils.StoreData($element[0], 'old-tabindex', tabindex);
|
||||||
$element.attr('tabindex', '-1');
|
$element.attr('tabindex', '-1');
|
||||||
|
|
||||||
// Set up containers and adapters
|
// Set up containers and adapters
|
||||||
@ -83,7 +83,7 @@ define([
|
|||||||
// Synchronize any monitored attributes
|
// Synchronize any monitored attributes
|
||||||
this._syncAttributes();
|
this._syncAttributes();
|
||||||
|
|
||||||
$element.data('select2', this);
|
Utils.StoreData($element[0], 'select2', this);
|
||||||
};
|
};
|
||||||
|
|
||||||
Utils.Extend(Select2, Utils.Observable);
|
Utils.Extend(Select2, Utils.Observable);
|
||||||
@ -510,11 +510,12 @@ define([
|
|||||||
this._sync = null;
|
this._sync = null;
|
||||||
|
|
||||||
this.$element.off('.select2');
|
this.$element.off('.select2');
|
||||||
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
|
this.$element.attr('tabindex',
|
||||||
|
Utils.GetData(this.$element[0], 'old-tabindex'));
|
||||||
|
|
||||||
this.$element.removeClass('select2-hidden-accessible');
|
this.$element.removeClass('select2-hidden-accessible');
|
||||||
this.$element.attr('aria-hidden', 'false');
|
this.$element.attr('aria-hidden', 'false');
|
||||||
this.$element.removeData('select2');
|
Utils.RemoveData(this.$element[0]);
|
||||||
|
|
||||||
this.dataAdapter.destroy();
|
this.dataAdapter.destroy();
|
||||||
this.selection.destroy();
|
this.selection.destroy();
|
||||||
@ -541,7 +542,7 @@ define([
|
|||||||
|
|
||||||
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
||||||
|
|
||||||
$container.data('element', this.$element);
|
Utils.StoreData($container[0], 'element', this.$element);
|
||||||
|
|
||||||
return $container;
|
return $container;
|
||||||
};
|
};
|
||||||
|
8
src/js/select2/data/select.js
vendored
8
src/js/select2/data/select.js
vendored
@ -119,7 +119,7 @@ define([
|
|||||||
// Remove anything added to child elements
|
// Remove anything added to child elements
|
||||||
this.$element.find('*').each(function () {
|
this.$element.find('*').each(function () {
|
||||||
// Remove any custom data set by Select2
|
// Remove any custom data set by Select2
|
||||||
$.removeData(this, 'data');
|
Utils.RemoveData(this);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ define([
|
|||||||
normalizedData.element = option;
|
normalizedData.element = option;
|
||||||
|
|
||||||
// Override the option's data with the combined data
|
// Override the option's data with the combined data
|
||||||
$.data(option, 'data', normalizedData);
|
Utils.StoreData(option, 'data', normalizedData);
|
||||||
|
|
||||||
return $option;
|
return $option;
|
||||||
};
|
};
|
||||||
@ -200,7 +200,7 @@ define([
|
|||||||
SelectAdapter.prototype.item = function ($option) {
|
SelectAdapter.prototype.item = function ($option) {
|
||||||
var data = {};
|
var data = {};
|
||||||
|
|
||||||
data = $.data($option[0], 'data');
|
data = Utils.GetData($option[0], 'data');
|
||||||
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
return data;
|
return data;
|
||||||
@ -238,7 +238,7 @@ define([
|
|||||||
data = this._normalizeItem(data);
|
data = this._normalizeItem(data);
|
||||||
data.element = $option[0];
|
data.element = $option[0];
|
||||||
|
|
||||||
$.data($option[0], 'data', data);
|
Utils.StoreData($option[0], 'data', data);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
4
src/js/select2/dropdown/attachBody.js
vendored
4
src/js/select2/dropdown/attachBody.js
vendored
@ -90,14 +90,14 @@ define([
|
|||||||
|
|
||||||
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
||||||
$watchers.each(function () {
|
$watchers.each(function () {
|
||||||
$(this).data('select2-scroll-position', {
|
Utils.StoreData(this, 'select2-scroll-position', {
|
||||||
x: $(this).scrollLeft(),
|
x: $(this).scrollLeft(),
|
||||||
y: $(this).scrollTop()
|
y: $(this).scrollTop()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$watchers.on(scrollEvent, function (ev) {
|
$watchers.on(scrollEvent, function (ev) {
|
||||||
var position = $(this).data('select2-scroll-position');
|
var position = Utils.GetData(this, 'select2-scroll-position');
|
||||||
$(this).scrollTop(position.y);
|
$(this).scrollTop(position.y);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
6
src/js/select2/dropdown/selectOnClose.js
vendored
6
src/js/select2/dropdown/selectOnClose.js
vendored
@ -1,6 +1,6 @@
|
|||||||
define([
|
define([
|
||||||
|
'../utils'
|
||||||
], function () {
|
], function (Utils) {
|
||||||
function SelectOnClose () { }
|
function SelectOnClose () { }
|
||||||
|
|
||||||
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
||||||
@ -21,7 +21,7 @@ define([
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $highlightedResults.data('data');
|
var data = Utils.GetData($highlightedResults[0], 'data');
|
||||||
|
|
||||||
// Don't re-select already selected resulte
|
// Don't re-select already selected resulte
|
||||||
if (
|
if (
|
||||||
|
16
src/js/select2/options.js
vendored
16
src/js/select2/options.js
vendored
@ -55,7 +55,7 @@ define([
|
|||||||
$e.prop('disabled', this.options.disabled);
|
$e.prop('disabled', this.options.disabled);
|
||||||
$e.prop('multiple', this.options.multiple);
|
$e.prop('multiple', this.options.multiple);
|
||||||
|
|
||||||
if ($e.data('select2Tags')) {
|
if (Utils.GetData($e[0], 'select2Tags')) {
|
||||||
if (this.options.debug && window.console && console.warn) {
|
if (this.options.debug && window.console && console.warn) {
|
||||||
console.warn(
|
console.warn(
|
||||||
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
||||||
@ -64,11 +64,11 @@ define([
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$e.data('data', $e.data('select2Tags'));
|
Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
|
||||||
$e.data('tags', true);
|
Utils.StoreData($e[0], 'tags', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($e.data('ajaxUrl')) {
|
if (Utils.GetData($e[0], 'ajaxUrl')) {
|
||||||
if (this.options.debug && window.console && console.warn) {
|
if (this.options.debug && window.console && console.warn) {
|
||||||
console.warn(
|
console.warn(
|
||||||
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
||||||
@ -77,8 +77,8 @@ define([
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$e.attr('ajax--url', $e.data('ajaxUrl'));
|
$e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
|
||||||
$e.data('ajax--url', $e.data('ajaxUrl'));
|
Utils.StoreData($e[0], 'ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
|
||||||
}
|
}
|
||||||
|
|
||||||
var dataset = {};
|
var dataset = {};
|
||||||
@ -86,9 +86,9 @@ define([
|
|||||||
// Prefer the element's `dataset` attribute if it exists
|
// Prefer the element's `dataset` attribute if it exists
|
||||||
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
||||||
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
||||||
dataset = $.extend(true, {}, $e[0].dataset, $e.data());
|
dataset = $.extend(true, {}, $e[0].dataset, Utils.GetData($e[0]));
|
||||||
} else {
|
} else {
|
||||||
dataset = $e.data();
|
dataset = Utils.GetData($e[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $.extend(true, {}, dataset);
|
var data = $.extend(true, {}, dataset);
|
||||||
|
10
src/js/select2/results.js
vendored
10
src/js/select2/results.js
vendored
@ -111,7 +111,7 @@ define([
|
|||||||
$options.each(function () {
|
$options.each(function () {
|
||||||
var $option = $(this);
|
var $option = $(this);
|
||||||
|
|
||||||
var item = $.data(this, 'data');
|
var item = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
// id needs to be converted to a string when comparing
|
// id needs to be converted to a string when comparing
|
||||||
var id = '' + item.id;
|
var id = '' + item.id;
|
||||||
@ -227,7 +227,7 @@ define([
|
|||||||
this.template(data, option);
|
this.template(data, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
$.data(option, 'data', data);
|
Utils.StoreData(option, 'data', data);
|
||||||
|
|
||||||
return option;
|
return option;
|
||||||
};
|
};
|
||||||
@ -310,7 +310,7 @@ define([
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = $highlighted.data('data');
|
var data = Utils.GetData($highlighted[0], 'data');
|
||||||
|
|
||||||
if ($highlighted.attr('aria-selected') == 'true') {
|
if ($highlighted.attr('aria-selected') == 'true') {
|
||||||
self.trigger('close', {});
|
self.trigger('close', {});
|
||||||
@ -422,7 +422,7 @@ define([
|
|||||||
function (evt) {
|
function (evt) {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
|
|
||||||
var data = $this.data('data');
|
var data = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
if ($this.attr('aria-selected') === 'true') {
|
if ($this.attr('aria-selected') === 'true') {
|
||||||
if (self.options.get('multiple')) {
|
if (self.options.get('multiple')) {
|
||||||
@ -445,7 +445,7 @@ define([
|
|||||||
|
|
||||||
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
||||||
function (evt) {
|
function (evt) {
|
||||||
var data = $(this).data('data');
|
var data = Utils.GetData(this, 'data');
|
||||||
|
|
||||||
self.getHighlightedResults()
|
self.getHighlightedResults()
|
||||||
.removeClass('select2-results__option--highlighted');
|
.removeClass('select2-results__option--highlighted');
|
||||||
|
9
src/js/select2/selection/allowClear.js
vendored
9
src/js/select2/selection/allowClear.js
vendored
@ -1,7 +1,8 @@
|
|||||||
define([
|
define([
|
||||||
'jquery',
|
'jquery',
|
||||||
'../keys'
|
'../keys',
|
||||||
], function ($, KEYS) {
|
'../utils'
|
||||||
|
], function ($, KEYS, Utils) {
|
||||||
function AllowClear () { }
|
function AllowClear () { }
|
||||||
|
|
||||||
AllowClear.prototype.bind = function (decorated, container, $container) {
|
AllowClear.prototype.bind = function (decorated, container, $container) {
|
||||||
@ -43,7 +44,7 @@ define([
|
|||||||
|
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
|
|
||||||
var data = $clear.data('data');
|
var data = Utils.GetData($clear[0], 'data');
|
||||||
|
|
||||||
for (var d = 0; d < data.length; d++) {
|
for (var d = 0; d < data.length; d++) {
|
||||||
var unselectData = {
|
var unselectData = {
|
||||||
@ -88,7 +89,7 @@ define([
|
|||||||
'×' +
|
'×' +
|
||||||
'</span>'
|
'</span>'
|
||||||
);
|
);
|
||||||
$remove.data('data', data);
|
Utils.StoreData($remove[0], 'data', data);
|
||||||
|
|
||||||
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
||||||
};
|
};
|
||||||
|
10
src/js/select2/selection/base.js
vendored
10
src/js/select2/selection/base.js
vendored
@ -21,10 +21,10 @@ define([
|
|||||||
|
|
||||||
this._tabindex = 0;
|
this._tabindex = 0;
|
||||||
|
|
||||||
if (this.$element.data('old-tabindex') != null) {
|
if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
|
||||||
this._tabindex = this.$element.data('old-tabindex');
|
this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
|
||||||
} else if (this.$element.attr('tabindex') != null) {
|
} else if (Utils.GetData(this.$element[0], 'tabindex') != null) {
|
||||||
this._tabindex = this.$element.attr('tabindex');
|
this._tabindex = Utils.GetData(this.$element[0], 'tabindex');
|
||||||
}
|
}
|
||||||
|
|
||||||
$selection.attr('title', this.$element.attr('title'));
|
$selection.attr('title', this.$element.attr('title'));
|
||||||
@ -130,7 +130,7 @@ define([
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $element = $this.data('element');
|
var $element = Utils.GetData(this, 'element');
|
||||||
|
|
||||||
$element.select2('close');
|
$element.select2('close');
|
||||||
});
|
});
|
||||||
|
4
src/js/select2/selection/multiple.js
vendored
4
src/js/select2/selection/multiple.js
vendored
@ -44,7 +44,7 @@ define([
|
|||||||
var $remove = $(this);
|
var $remove = $(this);
|
||||||
var $selection = $remove.parent();
|
var $selection = $remove.parent();
|
||||||
|
|
||||||
var data = $selection.data('data');
|
var data = Utils.GetData($selection[0], 'data');
|
||||||
|
|
||||||
self.trigger('unselect', {
|
self.trigger('unselect', {
|
||||||
originalEvent: evt,
|
originalEvent: evt,
|
||||||
@ -95,7 +95,7 @@ define([
|
|||||||
$selection.append(formatted);
|
$selection.append(formatted);
|
||||||
$selection.prop('title', selection.title || selection.text);
|
$selection.prop('title', selection.title || selection.text);
|
||||||
|
|
||||||
$selection.data('data', selection);
|
Utils.StoreData($selection[0], 'data', selection);
|
||||||
|
|
||||||
$selections.push($selection);
|
$selections.push($selection);
|
||||||
}
|
}
|
||||||
|
2
src/js/select2/selection/search.js
vendored
2
src/js/select2/selection/search.js
vendored
@ -81,7 +81,7 @@ define([
|
|||||||
.prev('.select2-selection__choice');
|
.prev('.select2-selection__choice');
|
||||||
|
|
||||||
if ($previousChoice.length > 0) {
|
if ($previousChoice.length > 0) {
|
||||||
var item = $previousChoice.data('data');
|
var item = Utils.GetData($previousChoice[0], 'data');
|
||||||
|
|
||||||
self.searchRemoveChoice(item);
|
self.searchRemoveChoice(item);
|
||||||
|
|
||||||
|
61
src/js/select2/utils.js
vendored
61
src/js/select2/utils.js
vendored
@ -258,5 +258,66 @@ define([
|
|||||||
$element.append($nodes);
|
$element.append($nodes);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Cache objects in Utils.__cache instead of $.data
|
||||||
|
Utils.__cache = {};
|
||||||
|
|
||||||
|
|
||||||
|
var id = 0;
|
||||||
|
Utils.GetUniqueElementId = function (element) {
|
||||||
|
// Get a unique element Id. If element has no id,
|
||||||
|
// creates a new unique number, stores it in the id
|
||||||
|
// attribute and returns the new id.
|
||||||
|
// If an id already exists, it simply returns it.
|
||||||
|
|
||||||
|
var select2Id = element.getAttribute('data-select2-id');
|
||||||
|
if (select2Id == null) {
|
||||||
|
// If element has id, use it.
|
||||||
|
if (element.id) {
|
||||||
|
select2Id = element.id;
|
||||||
|
element.setAttribute('data-select2-id', select2Id);
|
||||||
|
} else {
|
||||||
|
element.setAttribute('data-select2-id', ++id);
|
||||||
|
select2Id = id.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return select2Id;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.StoreData = function (element, name, value) {
|
||||||
|
// Stores an item in the cache for a specified element.
|
||||||
|
// name is the cache key.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (!Utils.__cache[id]) {
|
||||||
|
Utils.__cache[id] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.__cache[id][name] = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Utils.GetData = function (element, name) {
|
||||||
|
// Retrieves a value from the cache by its key (name)
|
||||||
|
// name is optional. If no name specified, return
|
||||||
|
// all cache items for the specified element.
|
||||||
|
// and for a specified element.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (name) {
|
||||||
|
if (Utils.__cache[id]) {
|
||||||
|
return Utils.__cache[id][name];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return Utils.__cache[id];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Utils.RemoveData = function (element) {
|
||||||
|
// Removes all cached items for a specified element.
|
||||||
|
var id = Utils.GetUniqueElementId(element);
|
||||||
|
if (Utils.__cache[id] != null) {
|
||||||
|
delete Utils.__cache[id];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return Utils;
|
return Utils;
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user