在这个问题上研究了很长一段时间后......我认为我有一个解决这个问题的方法。
我注意到 Select2 似乎在 DOM 中创建了自己的结构——与您正在与之交互的 Select 无关。 -- 这似乎也完全独立于您可能在 DOM 其他地方创建的 Select。
所以....经过一番摆弄 - 我想出了以下代码:
首先:为 DOM 中的所有 Select 创建一个全局绑定。这仅用于设置对当前用户正在使用的“内容”的临时引用——创建一个以后可以使用的全局变量。
$('select').select2().on('select2:open', function() {
// set a global reference for the current selected Select
console.log('found this ---> '+$(this).attr('id'));
if (typeof tempSelectedObj === 'undefined') {
tempSelectedObj = null;
}
tempSelectedObj = this;
});
第二:创建一个映射到 Select2 临时 INPUT 和 select2-search__field 类的文档 'keyup' 事件。这将捕获 Select2 INPUT 的所有关键事件。但在这种情况下,我添加了一个 keyCode === 13(返回字符)来初始化魔法。
$(document).on('keyup','input.select2-search__field',function (e) {
// capture the return event
if (e.keyCode === 13) {
var newValue = $(this).val();
console.log('processing this: '+newValue);
// create new option element
var newOpt = $('<option>')
.val(newValue)
.text(newValue);
// append to the current Select
$(tempSelectedObj)
.append(newOpt);
// apply the change and set it
$(tempSelectedObj)
.val(newValue)
.select2('close');
}
})
当检测到返回字符时,会发生以下情况。
- 捕获当前值
- 创建一个新的 DOM 选项元素 (jQuery)
- 设置新选项元素的值和文本
- 将新的选项元素附加到 tempSelectedObj 变量 (jQuery)
- 触发 Select2 关闭
- 将 Select2 的值设置为附加的新值
- 触发最终的 Select2 更改以显示新选项
- 完成!
显然,本示例需要这两段代码,但我认为对于很多人似乎都在努力解决的问题,这是一种非常巧妙的方法。而且它足够通用,可以轻松地为其他目的量身定制。
希望这会有所帮助!我已经为此苦苦挣扎了一段时间。
这是一个工作示例:
https://jsfiddle.net/h690bkmg/1/