Set up a public event relay
Now Select2 can fire jQuery events that will match the corresponding internal events. The `open` and `close` events are now publicly accessible. The selection adapter was chosen because it is the least likely to be moved, but handles the most common events. This `EventRelay` decorator should theoretically be able to decorate any of the adapters, as they all have the `bind` method that it needs.
This commit is contained in:
parent
bba967ba21
commit
64cb528f62
33
dist/js/select2.amd.full.js
vendored
33
dist/js/select2.amd.full.js
vendored
@ -1226,6 +1226,31 @@ define('select2/selection/search',[
|
|||||||
return Search;
|
return Search;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
define('select2/selection/eventRelay',[
|
||||||
|
'jquery'
|
||||||
|
], function ($) {
|
||||||
|
function EventRelay () { }
|
||||||
|
|
||||||
|
EventRelay.prototype.bind = function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
var relayEvents = ['open', 'close'];
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('*', function (name, params) {
|
||||||
|
if (relayEvents.indexOf(name) === -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var evt = $.Event('select2:' + name, params);
|
||||||
|
|
||||||
|
self.$element.trigger(evt);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return EventRelay;
|
||||||
|
});
|
||||||
|
|
||||||
define('select2/translation',[
|
define('select2/translation',[
|
||||||
|
|
||||||
], function () {
|
], function () {
|
||||||
@ -3299,6 +3324,7 @@ define('select2/defaults',[
|
|||||||
'./selection/placeholder',
|
'./selection/placeholder',
|
||||||
'./selection/allowClear',
|
'./selection/allowClear',
|
||||||
'./selection/search',
|
'./selection/search',
|
||||||
|
'./selection/eventRelay',
|
||||||
|
|
||||||
'./utils',
|
'./utils',
|
||||||
'./translation',
|
'./translation',
|
||||||
@ -3323,7 +3349,7 @@ define('select2/defaults',[
|
|||||||
], function ($, ResultsList,
|
], function ($, ResultsList,
|
||||||
|
|
||||||
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
||||||
SelectionSearch,
|
SelectionSearch, EventRelay,
|
||||||
|
|
||||||
Utils, Translation, DIACRITICS,
|
Utils, Translation, DIACRITICS,
|
||||||
|
|
||||||
@ -3444,6 +3470,11 @@ define('select2/defaults',[
|
|||||||
SelectionSearch
|
SelectionSearch
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.selectionAdapter = Utils.Decorate(
|
||||||
|
options.selectionAdapter,
|
||||||
|
EventRelay
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
if (typeof options.language === 'string') {
|
||||||
|
33
dist/js/select2.amd.js
vendored
33
dist/js/select2.amd.js
vendored
@ -1226,6 +1226,31 @@ define('select2/selection/search',[
|
|||||||
return Search;
|
return Search;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
define('select2/selection/eventRelay',[
|
||||||
|
'jquery'
|
||||||
|
], function ($) {
|
||||||
|
function EventRelay () { }
|
||||||
|
|
||||||
|
EventRelay.prototype.bind = function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
var relayEvents = ['open', 'close'];
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('*', function (name, params) {
|
||||||
|
if (relayEvents.indexOf(name) === -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var evt = $.Event('select2:' + name, params);
|
||||||
|
|
||||||
|
self.$element.trigger(evt);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return EventRelay;
|
||||||
|
});
|
||||||
|
|
||||||
define('select2/translation',[
|
define('select2/translation',[
|
||||||
|
|
||||||
], function () {
|
], function () {
|
||||||
@ -3299,6 +3324,7 @@ define('select2/defaults',[
|
|||||||
'./selection/placeholder',
|
'./selection/placeholder',
|
||||||
'./selection/allowClear',
|
'./selection/allowClear',
|
||||||
'./selection/search',
|
'./selection/search',
|
||||||
|
'./selection/eventRelay',
|
||||||
|
|
||||||
'./utils',
|
'./utils',
|
||||||
'./translation',
|
'./translation',
|
||||||
@ -3323,7 +3349,7 @@ define('select2/defaults',[
|
|||||||
], function ($, ResultsList,
|
], function ($, ResultsList,
|
||||||
|
|
||||||
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
||||||
SelectionSearch,
|
SelectionSearch, EventRelay,
|
||||||
|
|
||||||
Utils, Translation, DIACRITICS,
|
Utils, Translation, DIACRITICS,
|
||||||
|
|
||||||
@ -3444,6 +3470,11 @@ define('select2/defaults',[
|
|||||||
SelectionSearch
|
SelectionSearch
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.selectionAdapter = Utils.Decorate(
|
||||||
|
options.selectionAdapter,
|
||||||
|
EventRelay
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
if (typeof options.language === 'string') {
|
||||||
|
33
dist/js/select2.full.js
vendored
33
dist/js/select2.full.js
vendored
@ -10761,6 +10761,31 @@ define('select2/selection/search',[
|
|||||||
return Search;
|
return Search;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
define('select2/selection/eventRelay',[
|
||||||
|
'jquery'
|
||||||
|
], function ($) {
|
||||||
|
function EventRelay () { }
|
||||||
|
|
||||||
|
EventRelay.prototype.bind = function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
var relayEvents = ['open', 'close'];
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('*', function (name, params) {
|
||||||
|
if (relayEvents.indexOf(name) === -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var evt = $.Event('select2:' + name, params);
|
||||||
|
|
||||||
|
self.$element.trigger(evt);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return EventRelay;
|
||||||
|
});
|
||||||
|
|
||||||
define('select2/translation',[
|
define('select2/translation',[
|
||||||
|
|
||||||
], function () {
|
], function () {
|
||||||
@ -12834,6 +12859,7 @@ define('select2/defaults',[
|
|||||||
'./selection/placeholder',
|
'./selection/placeholder',
|
||||||
'./selection/allowClear',
|
'./selection/allowClear',
|
||||||
'./selection/search',
|
'./selection/search',
|
||||||
|
'./selection/eventRelay',
|
||||||
|
|
||||||
'./utils',
|
'./utils',
|
||||||
'./translation',
|
'./translation',
|
||||||
@ -12858,7 +12884,7 @@ define('select2/defaults',[
|
|||||||
], function ($, ResultsList,
|
], function ($, ResultsList,
|
||||||
|
|
||||||
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
||||||
SelectionSearch,
|
SelectionSearch, EventRelay,
|
||||||
|
|
||||||
Utils, Translation, DIACRITICS,
|
Utils, Translation, DIACRITICS,
|
||||||
|
|
||||||
@ -12979,6 +13005,11 @@ define('select2/defaults',[
|
|||||||
SelectionSearch
|
SelectionSearch
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.selectionAdapter = Utils.Decorate(
|
||||||
|
options.selectionAdapter,
|
||||||
|
EventRelay
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
if (typeof options.language === 'string') {
|
||||||
|
4
dist/js/select2.full.min.js
vendored
4
dist/js/select2.full.min.js
vendored
File diff suppressed because one or more lines are too long
33
dist/js/select2.js
vendored
33
dist/js/select2.js
vendored
@ -1654,6 +1654,31 @@ define('select2/selection/search',[
|
|||||||
return Search;
|
return Search;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
define('select2/selection/eventRelay',[
|
||||||
|
'jquery'
|
||||||
|
], function ($) {
|
||||||
|
function EventRelay () { }
|
||||||
|
|
||||||
|
EventRelay.prototype.bind = function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
var relayEvents = ['open', 'close'];
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('*', function (name, params) {
|
||||||
|
if (relayEvents.indexOf(name) === -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var evt = $.Event('select2:' + name, params);
|
||||||
|
|
||||||
|
self.$element.trigger(evt);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return EventRelay;
|
||||||
|
});
|
||||||
|
|
||||||
define('select2/translation',[
|
define('select2/translation',[
|
||||||
|
|
||||||
], function () {
|
], function () {
|
||||||
@ -3727,6 +3752,7 @@ define('select2/defaults',[
|
|||||||
'./selection/placeholder',
|
'./selection/placeholder',
|
||||||
'./selection/allowClear',
|
'./selection/allowClear',
|
||||||
'./selection/search',
|
'./selection/search',
|
||||||
|
'./selection/eventRelay',
|
||||||
|
|
||||||
'./utils',
|
'./utils',
|
||||||
'./translation',
|
'./translation',
|
||||||
@ -3751,7 +3777,7 @@ define('select2/defaults',[
|
|||||||
], function ($, ResultsList,
|
], function ($, ResultsList,
|
||||||
|
|
||||||
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
||||||
SelectionSearch,
|
SelectionSearch, EventRelay,
|
||||||
|
|
||||||
Utils, Translation, DIACRITICS,
|
Utils, Translation, DIACRITICS,
|
||||||
|
|
||||||
@ -3872,6 +3898,11 @@ define('select2/defaults',[
|
|||||||
SelectionSearch
|
SelectionSearch
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.selectionAdapter = Utils.Decorate(
|
||||||
|
options.selectionAdapter,
|
||||||
|
EventRelay
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
if (typeof options.language === 'string') {
|
||||||
|
4
dist/js/select2.min.js
vendored
4
dist/js/select2.min.js
vendored
File diff suppressed because one or more lines are too long
@ -396,6 +396,67 @@ $(".js-programmatic-multi-clear").on("click", function () { $exampleMulti.val(nu
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section id="events" class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h1>Events</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Select2 will trigger some events on the original select element,
|
||||||
|
allowing you to integrate it with other components. You can find more
|
||||||
|
information on events
|
||||||
|
<a href="options.html#events">on the options page</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<select class="js-states js-example-events form-control"></select>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<select class="js-states js-example-events form-control" multiple="multiple"></select>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<code>change</code> is fired whenever an option is selected or removed.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<code>select2:open</code> is fired whenever the dropdown is opened.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<code>select2:close</code> is fired whenever the dropdown is closed.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<h2>Example code</h2>
|
||||||
|
|
||||||
|
<ul class="js-event-log"></ul>
|
||||||
|
|
||||||
|
<pre data-fill-from=".js-code-events"></pre>
|
||||||
|
|
||||||
|
<script type="text/javascript" class="js-code-events">
|
||||||
|
var $eventLog = $(".js-event-log");
|
||||||
|
var $eventSelect = $(".js-example-events");
|
||||||
|
|
||||||
|
$eventSelect.on("select2:open", function (e) { log("select2:open"); });
|
||||||
|
$eventSelect.on("select2:close", function (e) { log("select2:close"); });
|
||||||
|
|
||||||
|
$eventSelect.on("change", function (e) { log("change"); });
|
||||||
|
|
||||||
|
function log (name, args) {
|
||||||
|
args = args || {};
|
||||||
|
var $e = $("<li>" + name + " -> " + JSON.stringify(args) + "</li>");
|
||||||
|
$eventLog.append($e);
|
||||||
|
$e.animate({ opacity: 1 }, 10000, 'linear', function () {
|
||||||
|
$e.animate({ opacity: 0 }, 2000, 'linear', function () {
|
||||||
|
$e.remove();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section id="tags" class="row">
|
<section id="tags" class="row">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<h1>Tagging support</h1>
|
<h1>Tagging support</h1>
|
||||||
@ -838,6 +899,8 @@ $.fn.select2.amd.require(
|
|||||||
$(".js-example-programmatic").select2();
|
$(".js-example-programmatic").select2();
|
||||||
$(".js-example-programmatic-multi").select2();
|
$(".js-example-programmatic-multi").select2();
|
||||||
|
|
||||||
|
$eventSelect.select2();
|
||||||
|
|
||||||
$tags.select2({
|
$tags.select2({
|
||||||
tags: ['red', 'blue', 'green']
|
tags: ['red', 'blue', 'green']
|
||||||
});
|
});
|
||||||
|
@ -15,13 +15,13 @@ slug: home
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 jumbotron-side">
|
<div class="col-md-6 jumbotron-side">
|
||||||
<p>
|
<p>
|
||||||
<a href="announcements-4.0.html" class="btn btn-success btn-lg">
|
<a href="https://github.com/select2/select2/releases" class="btn btn-success btn-lg">
|
||||||
<i class="fa fa-download fa-lg"></i>
|
<i class="fa fa-download fa-lg"></i>
|
||||||
Download
|
Download
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<strong>Version</strong> 4.0.0 <em>beta</em>
|
<strong>Version</strong> 4.0.0 <em>beta 1</em>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -632,6 +632,45 @@ ajax: {
|
|||||||
component that state has changed, as well as an adapter that allows some
|
component that state has changed, as well as an adapter that allows some
|
||||||
of these events to be relayed to the outside word.
|
of these events to be relayed to the outside word.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt>Adapter</dt>
|
||||||
|
<dd>
|
||||||
|
<code title="select2/selection">SelectionAdapter</code>
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>Decorator</dt>
|
||||||
|
<dd>
|
||||||
|
<code title="select2/selection/eventRelay">EventRelay</code>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Public events
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
All public events are relayed using the jQuery event system, and they are
|
||||||
|
triggered on the <code><select></code> element that Select2 is
|
||||||
|
attached to. You can attach to them using the
|
||||||
|
<a href="https://api.jquery.com/on/"><code>.on</code> method</a> provided
|
||||||
|
by jQuery.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Internal events
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Select2 triggers internal events using its own internal event system,
|
||||||
|
which allows adapters to communicate with each other. These events are not
|
||||||
|
accessible through the jQuery event system.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You can find more information on the public events triggered by individual
|
||||||
|
adapters in <a href="#adapters">the individual adapter documentation</a>.
|
||||||
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="adapters">
|
<section id="adapters">
|
||||||
|
8
src/js/select2/defaults.js
vendored
8
src/js/select2/defaults.js
vendored
@ -7,6 +7,7 @@ define([
|
|||||||
'./selection/placeholder',
|
'./selection/placeholder',
|
||||||
'./selection/allowClear',
|
'./selection/allowClear',
|
||||||
'./selection/search',
|
'./selection/search',
|
||||||
|
'./selection/eventRelay',
|
||||||
|
|
||||||
'./utils',
|
'./utils',
|
||||||
'./translation',
|
'./translation',
|
||||||
@ -31,7 +32,7 @@ define([
|
|||||||
], function ($, ResultsList,
|
], function ($, ResultsList,
|
||||||
|
|
||||||
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
SingleSelection, MultipleSelection, Placeholder, AllowClear,
|
||||||
SelectionSearch,
|
SelectionSearch, EventRelay,
|
||||||
|
|
||||||
Utils, Translation, DIACRITICS,
|
Utils, Translation, DIACRITICS,
|
||||||
|
|
||||||
@ -152,6 +153,11 @@ define([
|
|||||||
SelectionSearch
|
SelectionSearch
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.selectionAdapter = Utils.Decorate(
|
||||||
|
options.selectionAdapter,
|
||||||
|
EventRelay
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof options.language === 'string') {
|
if (typeof options.language === 'string') {
|
||||||
|
24
src/js/select2/selection/eventRelay.js
vendored
Normal file
24
src/js/select2/selection/eventRelay.js
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
define([
|
||||||
|
'jquery'
|
||||||
|
], function ($) {
|
||||||
|
function EventRelay () { }
|
||||||
|
|
||||||
|
EventRelay.prototype.bind = function (decorated, container, $container) {
|
||||||
|
var self = this;
|
||||||
|
var relayEvents = ['open', 'close'];
|
||||||
|
|
||||||
|
decorated.call(this, container, $container);
|
||||||
|
|
||||||
|
container.on('*', function (name, params) {
|
||||||
|
if (relayEvents.indexOf(name) === -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var evt = $.Event('select2:' + name, params);
|
||||||
|
|
||||||
|
self.$element.trigger(evt);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return EventRelay;
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user