我尝试通过使用jquery ajax调用更新datalist本身来通过datalist更新html表单中的输入。如果使用ajax,当我再次单击输入字段时,输入不显示选项但。没有ajax的静态测试版本可以按预期工作,在输入字段中输入时显示选项。
HTML标记
<form id="formID" class="form-horizontal">
<div class="control-group">
<label class="control-label" for="input">Location</label>
<div class="controls">
<input type="text" list="LIST_CITIES" id="inputCity"
placeholder="Enter your location..">
</div>
</div>
<!-- submit -->
<button type="submit" class="btn">Submit</button>
</form>
<datalist id="LIST_CITIES"></datalist>
没有ajax(确实有效):
$('.controls').on("input click", "#inputCity", function(e) {
var val = $(this).val();
dataList.empty();
if(val === "" || val.length < 3) return;
if(testObj.results.length) {
for(var i=0, len=testObj.results.length; i<len; i++) {
var opt = $("<option></option>").attr("value", testObj.results[i]['city']);
tempObj[testObj.results[i]['city']] = testObj.results[i]['id'];
dataList.append(opt);
}
}
});
使用ajax(在键入时不起作用):
$('.controls').on("input click", "#inputCity", function(e) {
var val = $(this).val();
dataList.empty();
if(val === "" || val.length < 3) return;
$.ajax({
type: "GET",
url: GET_cities,
data: {startswith: val, maxRows: 5},
success:function(data){
if(data.results.length) {
for(var i=0, len=data.results.length; i<len; i++) {
var opt = $("<option></option>").attr("value", data.results[i]['city']);
tempObj[data.results[i]['city']] = data.results[i]['id'];
dataList.append(opt);
}
}
}
});
答案 0 :(得分:2)
”不起作用“ - 这是因为ajax是异步的。因此,当有人在输入框中键入数据时,它会对您的服务器进行ajax调用,并且在响应返回之前它将无法显示输出。你仍然可以在你的ajax调用中尝试async:false。它将锁定浏览器,直到您的响应从服务器返回,但这不是一个好主意。
$.ajax({
type: "GET",
url: GET_cities,
**async:false,**
data: {startswith: val, maxRows: 5},
success:function(data){
if(data.results.length) {
for(var i=0, len=data.results.length; i<len; i++) {
var opt = $("<option></option>").attr("value", data.results[i]['city']);
tempObj[data.results[i]['city']] = data.results[i]['id'];
dataList.append(opt);
}
}
}
});
答案 1 :(得分:0)
你需要这样做:
删除
var opt = $("<option></option>").attr("value", data.results[i]['city']);
并替换:
dataList.append(opt);
使用:
dataList.append("<option value='" + data.results[i]['city'] + "'>");
并添加:
$.ajax({
...
async:false,
...
});
对我来说它有效!
答案 2 :(得分:0)
您可能想尝试使用setInterval和clearInterval。
例如:
var wait = false;
$('.controls').on("input click", "#inputCity", function() {
var val = this.value; // All hail Vanilla JS
dataList.empty();
var tempObj = []; // This wasn't in your question, but I had to declare it to get rid of undefined variable errors
if(val === "" || val.length < 3) return;
if(wait) window.clearInterval(wait);
wait = setInterval(function(){
$.get(GET_cities,{startsWith:val,maxRows: 5},function(result){
// If what you get is already an array, you can skip this line
result = JSON.parse(result);
if(result.results.length){
for(var city in data.results){
if(data.results.hasOwnProperty(city){
var opt = $("<option></option>").attr("value",city['city']);
tempObj[city['city']] = city['id'];
dataList.append(opt);
}
}
}
});
},200); // Change 200 mili-seconds to a delay of your desire
}