Chr*_*sen 10 jquery jquery-select2 jquery-select2-4 select2
我使用jquery-select2-4搜索外部数据库,并向用户显示他可以选择的搜索结果.
我有一个在这个jsfiddle上运行的工作版本.
但是,例如,如果只返回1个搜索结果,我想跳过整个选择过程,只需将返回的搜索结果添加到所选选项列表中.根据select2文档,我可以添加一个像这样的新选项:
option = new Option("Sample text", "123", true, true);
select2_element.append(option);
select2_element.trigger('change');
Run Code Online (Sandbox Code Playgroud)
这似乎在某种程度上起作用.但是有一些问题.
id和a text.undefined.我意识到这个问题包含3个方面,但所有3个方面可能都会回到这个问题:
如何以编程方式添加新的jquery-select2-4选项并重置搜索字段?
供您参考,这是我要问的代码的上下文:
var formatRepo, formatRepoSelection, selectRepos;
formatRepoSelection = function(element) {
return element.name + ' ' + element.forks + ' ' + element.id;
};
formatRepo = function(element) {
var markup;
if (!element.loading) {
return markup = element.name + ' ' + element.id;
}
};
selectRepos = function() {
var option, select2_element;
select2_element = $('#select2_element');
select2_element.select2({
ajax: {
url: "https://api.github.com/search/repositories",
dataType: 'json',
data: function (params) {
return {
q: params.term,
page: params.page
};
},
processResults: function (data, params) {
if (data.items.length === 1) {
// START: The code I am asking about.
// Add the search result directly as an option.
option = new Option("Sample text", "123", true, true);
select2_element.append(option);
return select2_element.trigger('change');
// END: The code I am asking about.
} else {
params.page = params.page || 1;
return {
results: data.items,
pagination: {
more: (params.page * 30) < data.total_count
}
};
}
},
cache: true
},
escapeMarkup: function(markup) {
return markup;
},
templateResult: formatRepo,
templateSelection: formatRepoSelection
});
};
$(function() {
return selectRepos();
});
Run Code Online (Sandbox Code Playgroud)
我对原来的代码做了两处修改:
正如您所指出的,元素的创建option有其局限性:您只能指定id和text属性,而无法访问所选项目的其他属性。
此外,它还会生成未定义的值。这是因为回调函数formatRepoSelection尝试访问为元素创建的对象未定义的属性( name和forksoption ) 。您可以尝试解决此问题并在这种情况下使用text属性,但您仍然无法解决上述限制。
我在这里建议的解决方案有不同的方法。您可以模拟用户对最后一项的选择,向该列表项发送mouseup事件,而不是直接创建标签。
这样做的直接优点是应用正常的选择行为,就好像用户单击了该项目一样,因此它可以立即解决您遇到的所有三个问题:
这是实现此功能的代码:
if (data.items.length === 1) {
// Change 1:
// Allow the list to update
setTimeout(function() {
// ... and then send a click event to the first list item
// Note the used id has the SELECT id in the middle.
$("#select2-select2_element-results li:first-child").trigger('mouseup');
}, 0);
Run Code Online (Sandbox Code Playgroud)
此解决方案的缺点是您使自己依赖于实现方面;select2的未来版本可能会在 HTML 元素和属性方面以不同的方式组织结果。
但是,每当您决定使用较新版本的select2时,更新代码应该不是什么大问题。
您的代码在select2库中生成了错误:
类型错误:b 未定义,位于 select2.min.js:2:9842
这是因为这样的声明:
return select2_element.trigger('change');
Run Code Online (Sandbox Code Playgroud)
这将返回 jQuery select2_element对象,但库期望返回值具有results属性。
由于不再需要该触发器,因此可以通过将上面的内容替换为以下内容来解决此问题:
// Change 2:
// Return empty results array
return {
results: data.items
};
Run Code Online (Sandbox Code Playgroud)
不要试图设置results: [],因为我们仍然需要该项目来模拟鼠标事件。
而且……仅此而已。
这是工作解决方案:JS fiddle。
| 归档时间: |
|
| 查看次数: |
1119 次 |
| 最近记录: |