2017-05-30 13 views
1

私は入力フィールドを持っています。このフィールドにキーアップがあると、私はリクエストを送信します。私の問題は、別のキーアップイベントが発生したときです。保留中のリクエストをすべてキャンセルする必要があります。私は多くの答えを見てきましたが、私は解決策を見出していません。保留中のajaxリクエストをキャンセルする方法typeahead.js

var data = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.whitespace, 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    remote: { 
     wildcard: '%QUERY', 
     url: $('.typeahead').attr('data-autocomplete-url') + '?term=%QUERY', 
     rateLimitBy: 'throttle', 
     ajax: { 
      async: true, 
      dataType: 'json', 
      crossDomain: true, 
     } 
    } 

}); 

$('.typeahead').typeahead({ 
    hint: true, 
    highlight: true, 
    minLength: 1 
},{ 
    name: 'company', 
    displayKey: 'id', 
    limit: Infinity, 
    source: data, 
    templates: { 
     empty: [ 
      '<div style="margin: 4px 30px 4px 30px;" class="empty-message">', 
      ' Aucun résultat trouvé ', 
      '</div>' 
     ].join('\n'), 
     suggestion: function(data) { 
      if(data.id_db == 'more'){ 
       return '<p style="pointer-events:none">'+ data.text +'</p>'; 
      }else{ 
       return '<p>'+ data.text +'</p>'; 
      } 

     } 
    } 
}).on('typeahead:select', function(ev, data) { 
    $('#id_db').val(data.id_db); 
    changeCompany($(this)); 
}); 
+0

あなたは少しあなたのリモート設定を変更して、中止()関数を使用して欲しいものacchieveことができます。私の答えはこちら:https://stackoverflow.com/a/46959188/3638529 – joalcego

答えて

0

これは私が使用するトリックです。 clearTimeoutは前のイベントをキャンセルします。したがって、クライアントが400ミリ秒間入力を停止すると、Ajax呼び出しが行われます。

(私が先行入力を知っているので、それが必要であることを取り扱うどんなイベントは使用しないでください...)

var timer; 
$('.typeahead').on('keyup', function(e) { 
    clearTimeout(timer); 
    timer = setTimeout(function() { 
     $.ajax({ 
     ... 
     }); 
    }, 
    400 // Guestimate the best value you want, usually I use 300 - 400 ms 
) 
}); 
関連する問題