【发布时间】:2018-10-26 15:54:42
【问题描述】:
出于不同的原因,我想摆脱 Jquery UI 自动完成功能并将其替换为具有动态加载选项字段的 HTML5 数据列表。我在这个话题上搜索了好几天,在 stackoverflow 上也找到了不同的答案,比如How do you refresh an HTML5 datalist using JavaScript?,我认为这与我搜索的内容非常接近。
我想要选择标签的数据列表,它将在输入字段中以逗号分隔。问题是只有第一个标签才能正确显示数据列表。键入“字母”时未显示第二个的建议。
现在进入流程:
键入:应用程序
服务器响应:
['apple','pinapple','snapper']
显示的数据列表建议:
apple
pinapple
snapper
我现在选择:apple,写入输入字段,然后:
输入:,in
服务器响应:
['intest','instructor','insula']
显示的数据列表建议:没有,这就是问题
但是:
如果我现在按退格键并删除最后一个符号,则输入字段中现在是:
apple, i
然后 Firefox 显示为选项:
apple, intest
apple, instructor
apple, insula
我知道有一个比较值或者innerHTML的字段,所以我用:
<option value="apple, intest">apple, intest</option>
现在是代码示例:
HTML
<input list="autocompleteList" type="text" class="form-control" name="Tags" id="Tags">
<datalist id="autocompleteList"></datalist>
JS
// Used for querying only the last word of input field
function extractLast( term ) { return split( term ).pop(); }
$( document ).on( "input","*[name=Tags]", function( e ) {
var _this = $(this);
var input = _this.val();
var first_part;
// If a first tag is already inserted, now extract it for later use
if ( input.split(/,|,\s*| /).length > 1 ) {
var temp = input.split(/,|,\s*| /);
first_part = temp.filter(function (el) { return el.trim() != ""; }).slice(0,-1).join(', ') + ', ';
console.log("EXTRACTED FIRST PART " + first_part);
} else {
first_part = '';
}
if ( extractLast(input).length >= 2 ) {
$.ajax({
dataType: "json",
type : 'POST',
async:true,
url: 'example.com/suggester',
data: {term: extractLast( input )},
success: function (data) {
$("#autocompleteList").empty();
for (i=0; i<data.length; i++) {
$("#autocompleteList").append('<option value="' + first_part + data[i] + '">' + first_part + data[i] + '</option>');
}
// Array of Tags
console.log("DATA FROM SERVER: " + data);
// For inspection
console.log("CONTENT OF AUTOCOMPLETE LIST: " + $('#autocompleteList').html());
}
});
}
});
我已经测试过的内容:
- 更改:从输入到 keypress、keyup、keydown、更改 -> 不成功
- 手动触发事件:_this.focus() 或其他 --> 无响应
- 在数据列表上使用 JQuery show()
- 将选项嵌入到 HTML 选择中。在这种情况下,datalist 也无法按预期工作,但由 select 触发的下拉菜单可以正常工作并快速刷新。
所以,最后:
我怎样才能实现在输入字母时打开数据列表选项而不按退格键?
提前谢谢你!
【问题讨论】:
标签: javascript jquery ajax html datalist