2016-03-28 30 views
1

jQuery eklentisi Autocomplete like Google kullanıyorum ve çok iyi çalışıyor. Ancak AJAX talebi her tuşa basıldığında tetiklenir. Yani, washington dizgisi on (!) Isteklere neden olur. Eh, isteklerin sayısı minLength seçeneğini kullanarak azaltılabilir. Ancak ör. minLength:3 ile hala yedi istek gönderiyoruz (dördüncü karakterle başlıyor). Mümkün/Google eklentisi gibi jQuery Otomatik Tamamlama için bir gecikme nasıl ayarlanır?

$(function() { 
    $("#bar").autocomplete({ 
     minLength: 3, 
     limit: 5, 
     source : [ 
      function(query, add) { 
       fooNumber = $('#foo-number').val(); 
       $.getJSON("/my/ajax/controller/bar?data[number]=" + query + "&data[foo_name]=" + fooNumber, function(response) { 
        add(response); 
       }) 
     }], 
    }); 
}); 

nasıl sunucudan istemesi anlık önlemek ve kullanıcı 300 ms ıla örneğin beri yazmaya olmamıştır zaman, script sadece yeni bir istek gönderebilir yapılır?

cevap

1

Üzgünüz, anladım. Sen kaynak ile fonksiyonu ile mantık ve mantık yapabilirdiniz, (, test etmemiş)

var zamanlayıcı;

$("#bar").autocomplete({ 
     minLength: 3, 
     limit: 5, 
     cacheLength: 1, 
     source : [ 
      function(query, add) { 

       clearTimeout(timer); 

       timer = setTimeout(function(){ 

        fooNumber = $('#foo-number').val(); 
        $.getJSON("/my/ajax/controller/bar?data[number]=" + query + "&data[foo_name]=" + fooNumber, function(response) { 
         add(response); 
        }) 

       }, 300) 

     }], 
    }); 

Yoksa jquery ui> geçiş olabilir

Orjinal cevap:

jquery ui otomatik tamamlama dahili bunun için parametre itibaren gecikme (DOCS)

dokümanlar:

$(".selector").autocomplete({ 
    delay: 500 
}); 
+0

Cevabınız için teşekkürler! Çalışır ('ReferenceError: timer tanımlı değil') için 'timer = null;' ile çalışır. Ama öyle değil, aradığım şey. Zaman aşımı şu anlama gelir: Sadece bir süre sonra tüm (gereksiz) istekler gönderilecektir. E.g .: 'washington' hala 7 istek üretiyor, bunlar daha sonra biraz yollanıyor. İstediğim isteklerin sayısını azaltmak. Sonraki her bir requst gönderilmelidir. arama kelimesini yazmayı bıraktığımda. – automatix

+0

Başka bir otomatik tamamlama eklentisine geçiş şu anda bir seçenek değil, bu yüzden "Google gibi Otomatik Tamamla" ile denemek zorundayım. – automatix

1

Bu yararlı olabilir. (Test Edilmedi)

//global variable 
var keyPressed = new Date(); 
// Call where you're watching for pressed keys. 
var updateKeyPressed = function(){ 
    keyPressed = new Date(); 
} 

$(function() { 
    $("#bar").autocomplete({ 
     minLength: 3, 
     limit: 5, 
     appendMethod:'replace', 
     closeOnBlur: true, 
     source : [ 
      function(query, add) { 
       var currentDate = new Date(); 
       setInterval(function(){ 
        currentDate = new Date(); 
        if (currentDate.getTime() > keyPressed.getTime()) { 
         orderApplicationNumber = $('#foo-number').val(); 
         $.getJSON("/my/ajax/controller/bar?data[number]=" + query + "&data[foo_name]=" + fooNumber, function(response) { 
          add(response); 
         }); 
        } 
       }, 300); 
      } 
     ], 
    }); 
}); 
+0

Teşekkürler! Kodu düzelttim, bu yüzden şimdi çalıştırılabilir (bazı parantezler yanlış ayarlanmıştı). Ancak şimdi istek doğrudan sayfa yüklendikten sonra gönderilir ve sunucuya her zaman gönderilir (sonsuz döngüde olduğu gibi). – automatix

+0

"currentDate" öğesini iki kez ayarlıyorum ve 'updateKeyPressed()' işlevini yanlış yere çağırdım. Şimdi bunu hata ayıkladım - ve işe yarıyor! Çok teşekkür ederim! – automatix

+0

Bu gerçekten iyi bir çözüm, ancak benim için bir çözüm değil. Ayrıca yazmadan otomatik tamamlamayı önleyen yan etkiye de sahiptir. Her neyse, cevabı kabul etmeyeceğim, ama bunun için bir +1 vereceğim. Yardımın için teşekkürler! – automatix