我正在尝试根据json文件中键值对的用户输入创建一个基本上自动完成的搜索框。看起来使用datalist可能是最好的选择,但是当我执行下面的代码时,html中不会出现任何选项标签。
我仍然是jquery和json的新手,所以我愿意接受建议。
这是json。如果相关,该列表包含1450个项目:
{ "osCars": [
{ "id": 1,
"name": "Cadillac",
"type": "Sedan",
"desc": "A fine American automobile"
},
{ "id": 2,
"name": "BWM",
"type": "Sedan",
"desc": "A fine German automobile"
},
{ "id": 3,
"name": "Lexus",
"type": "Sedan",
"desc": "A fine Japanese automobile"
}
]}
这是html:
<input type="text" maxlength="30" list="carList" id="carSearchBox" name="carSearchBox" pattern="[A-Za-z '-]*$" placeholder="search cars" autofocus autocomplete="on">
<datalist id="carList"></datalist>
<script src="js/main.js"></script>
<script>window.onload=getCars;</script>
这是javascript / jquery:
function getCars() {
var url, carOption;
url = 'js/cars.json';
$.getJSON(url, function(data) {
//populate the cars datalist
$(data.osCars).each(function() {
carsOption = "<option value=\"" + this.id + "\">" + this.name + "</option>";
$('#carList').append(carsOption);
});
});
}
答案 0 :(得分:1)
事实证明问题不是我怀疑的javascript,而是我的JSON文件。我使用了我拥有的不同JSON文件的URL(我知道它是有效的),一切正常。我想使用的文件太长,无法使用jsonLint进行验证,并且有一些冗长的文本值。那里可能有一个错误的双引号,我没有看到,这就是把它扔掉。
答案 1 :(得分:0)
我认为问题是你使用this.id作为值,而不是this.name。 HTML5中的数据主义和自动完成功能似乎尚未在浏览器中一致地实现。例如:Chrome在数据列表中似乎有问题,选项的内部html(显示值)与值不同。
更改代码以使用“this.name”同时使用id和值可以正常工作(至少在Chrome中):
function getCars() {
$(data.osCars).each(function (idx, o) {
carsOption = "<option value='" + this.name + "'>" + this.name + "</option>";
$('#carList').append(carsOption);
});
}
请参阅此fiddler示例: http://jsfiddle.net/6HGuU/
这个相关问题: HTML5 datalist value vs. inner-text
如果您需要检索所选的ID而不是名称,那么您可以将其视为一个单独的步骤(相关问题包含一个答案,其中提出的方法可以完成此操作)。