4

jquery ajax呼び出しを使用してデータリスト自体を更新することにより、データリストを介して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);
      }
    }
  }
});
4

3 に答える 3

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,
    ...
});

私にとってはうまくいきます!

于 2013-05-03T21:21:34.750 に答える
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
}
于 2014-10-28T23:22:37.220 に答える