Select2删除所有的第一个标签
Select2 removes all put the first tag
我在Django中使用Select2作为多对多关系。由于存在各种验证约束,我发现在将相关对象输入Select2标记字段时,通过AJAX请求创建相关对象是最容易的。下面是一个最小的例子(和一个小提琴)。
HTML:<select class="js-example-tags form-control" multiple="" tabindex="-1" aria-hidden="true"></select>
一点CSS:
.js-example-tags {
width: 100%;
}
和JS:
function register(event) {
console.log(event);
if (event.params.data.id == event.params.data.text) {
$.ajax({
type: 'POST',
url: 'https://www.random.org/integers/?num=1&min=0&max=999&col=1&base=10&format=plain&rnd=new',
success: function(data) {
$('option[value="' + event.params.data.text + '"').attr('value', data);
},
error: function(jqXHR, textStatus, errorThrown) {
$('option[value="' + event.params.data.id + '"]').remove();
}
});
}
}
$(".js-example-tags").select2({
tags: true,
data: [{"text": "Known Author 1", "id": 1}, {"text": "Known Author 2", "id": 2}]
});
$(".js-example-tags").on('select2:select', register);
当用户点击return时:
- Select2应该添加新的选项value = text作为占位符和
- 触发
select2:select
事件,从而触发register
功能, - 的AJAX调用将(希望)返回新创建的对象ID,
- ,将原来的选项值替换为实际值。
但显然,发生了一些其他的事情:第一个标签被正确地添加了——至少从视觉上看是这样——但是当您添加第二个标签时,它在按回车键时消失了,并且从第三个标签开始,新的标签覆盖了第一个标签。
在这一点上,Select2文档是最小的,所以这可能是一个使用错误。谢谢你!
新方案
我发现[这个问题评论](https://github.com/select2/select2/issues/3057#issuecomment-77560623))在旧的解决方案在某些情况下停止工作后,在Select2 bug跟踪器中。我不知道为什么selected: true
属性曾经为我工作;也许只是看起来碰巧起作用了。(新的小提琴。)
function selectOption(select, id) {
var selectedValues = select.val();
if (selectedValues == null) {
selectedValues = new Array();
}
selectedValues.push(id);
select.val(selectedValues).trigger('change');
}
function register(event) {
if (typeof variable !== event.params &&
event.params.data.text == event.params.data.id) {
$.ajax({
type: 'POST',
url: 'https://www.random.org/integers/?num=1&min=0&max=999&col=1&base=10&format=plain&rnd=new',
success: function(data) {
var select = $(event.target);
var id = data.replace(/^'s+|'s+$/g, '');
var text = event.params.data.text;
select.find('option[data-select2-tag="true"][value="' + text + '"]').remove();
select.append('<option value="' + id + '">' + text + '</option>');
selectOption(select, id);
}
});
}
}
var select = $(".js-example-tags");
select.select2({
tags: true,
// selectOnClose: true, // Too much recursion error
data: [{"text": "Known Author 1", "id": 1}, {"text": "Known Author 2", "id": 2}]
});
select.on('select2:select', register);
附加问题:单词"is"有什么特别之处,它总是被Select2剥离?其他典型的停顿词不会被删除。
<标题>老解
最后(或者到目前为止算结束)我已经采用了Dario建议的解决方案-在每个条目(Fiddle)之后完全重新创建Select2输入:
function initSelect2(select) {
select.find('option[data-select2-tag="true"]').remove();
select.select2({
tags: true,
// selectOnClose: true, // Too much recursion error
data: select.data('entries')
});
}
function register(event) {
if (typeof variable !== event.params &&
event.params.data.text == event.params.data.id) {
var model = $(event.target).data('model');
$.ajax({
type: 'POST',
url: 'https://www.random.org/integers/?num=1&min=0&max=999&col=1&base=10&format=plain&rnd=new',
success: function(data) {
var select = $(event.target);
var entries = select.data('entries');
entry = {id: data.replace(/^'s+|'s+$/g, ''),
text: event.params.data.text,
selected: true};
entries.push(entry);
select.data('entries', entries);
initSelect2(select);
select.parent().find('input.select2-search__field').focus();
}
});
}
}
var select = $(".js-example-tags");
select.data('entries', [{"text": "Known Author 1", "id": 1}, {"text": "Known Author 2", "id": 2}]);
initSelect2(select);
select.on('select2:select', register);
我遇到的两个问题是:
- 字段失去焦点,需要放回
input
字段Select2生成,和 - ,重新初始化保留
data-select2-tag
字段(与占位符ID)除了新添加的字段与适当的ID,所以第一个需要被清除之前,Select2是重新创建。
相关文章:
- 只有第一个按钮在带有 Jquery 的 forEach 标签中有效
- HTML5音频标签没有播放声音的铬和safari中的第一个未聚焦标签
- 为什么我的第一个标签出现在饼图后面
- JavaScript 替换第一个/最后一个字母并将中间文本括在标签中
- 将标签元素的第一个字母大写
- 数据标签格式化程序在 Highchart 中用于第一个类别
- 替换标签内的第一个字符
- 使用jquery只获取第一个标签内容
- Bootstrap 3标签数据只显示在第一个标签
- 使用javascript显示页面加载的第一个标签
- 如何用jQuery在span标签中换行文本,除了第一个单词
- Highcharts缺少xAxis上的第一个日期标签
- 将每个单词的第一个字母包装在span标签- javascript中
- 如何在第一个<标签
- 在jQuery中从标签名中获取第一个元素
- 使用 Javascript DOM 获取带有标签名称的第一个元素
- 如何删除表格中每个td标签的第一个字符,然后用Google Chart API和Javascript显示它
- Select2删除所有的第一个标签
- jQuery标签- jQuery脚本只适用于第一个标签-坏初始化
- 自动完成TAB键应该返回json列表的第一个标签