2012-04-12 20 views
9

मेरे पास टाइपिंग करते समय उपयोगकर्ता अजाक्स कॉल कर रहे हैं। समस्या यह है कि यह हर पत्र टाइप किया जा रहा है के लिए कॉल करता है, तो मैं इस तरह समयबाह्य सेट करें:जब तक उपयोगकर्ता टाइपिंग बंद नहीं करता तब तक फ़ंक्शन की प्रतीक्षा करें

$(input).live('keyup', function(e){ 

setTimeout(function(){ 

var xx = $(input).val(); 
doSearch(xx); 

}, 400); 

}); 

यह 400 मि.से के लिए प्रतीक्षा करता है, लेकिन फिर हर KeyUp के लिए निष्पादित करता है। आखिरी टाइप किए गए पत्र के बाद AJAX कॉल को केवल 400 बार के बारे में 'एक बार' बनाने के लिए मैं इसे कैसे बदल सकता हूं?

(मैं अतीत में 'देरी' थे, लेकिन है कि मेरी स्क्रिप्ट के साथ बिल्कुल काम नहीं करता है ...)

+0

पहले से ही अन्य प्रश्न में प्रदान किया गया एक समाधान है: https://stackoverflow.com/questions/4220126/run-javascript-function-when-user-finishes-typing-instead-of-on-key-up/16324620 # 16324620 –

उत्तर

18
timer = 0; 
function mySearch(){ 
    var xx = $(input).val(); 
    doSearch(xx); 
} 
$(input).live('keyup', function(e){ 
    if (timer) { 
     clearTimeout(timer); 
    } 
    timer = setTimeout(mySearch, 400); 
}); 

इसे कई बार, एक नामित कार्य करने के लिए अपने कार्य को स्थानांतरित करने और इसे कहते हैं क्योंकि अन्यथा आप प्रत्येक KeyUp जो अनावश्यक और अपेक्षाकृत महंगे

+0

यह एक आकर्षण की तरह काम करता है :) – Youss

+0

@Youss और क्या होता है यदि आप एक कुंजी दबाते हैं और छोड़ते हैं, और फिर एक और कुंजी दबाए रखें? – Alnitak

+0

@Annitak, आप सही हैं, और इसके साथ अन्य समस्याएं हैं, उदाहरण के लिए जब आप बहुत धीमी (2 कुंजी के बीच 400 मिमी से अधिक) टाइप करते हैं, लेकिन सामान्य स्थिति में यह चीजों को आसान बनाता है – Gavriel

4

आप टाइमर हर बार एक नया कुंजी दबाया जाता है, उदाहरण के लिए रीसेट करने की आवश्यकता

(function() { 
    var timer = null; 

    $(input).live('keyup', function(e) { 
     timer = setTimeout(..., 400); 
    }); 

    $(input).live('keydown', function(e) { 
     clearTimeout(timer); 
    }); 
)(); 

समारोह अभिव्यक्ति सुनिश्चित करना है कि timer चर का दायरा उन दो कार्य यह है कि जरूरत के लिए प्रतिबंधित है प्रयोग किया जाता है।

+0

शायद '.on (' keyup ', ...) का उपयोग करना चाहिए क्योंकि चूंकि jquery 1.7 '.live' को बहिष्कृत कर दिया गया है। – ZombieCode

+0

@Ekaterina हां, शायद यह चाहिए, लेकिन यह ओपी के कोड में बदलावों का न्यूनतम सेट था। – Alnitak

0

मुझे लगता है कि लगता है कि होता है पर एक और लैम्ब्डा समारोह बना रहे हैं बेहतर है आप इस संदर्भ में तब तक delay() का उपयोग कर सकते हैं जब तक आप ठीक हो मिश्रण में एक नया अस्थायी 'कुछ' जोड़ने के साथ। क्या यह आपके लिए काम करेगा?

$(input).on('keyup', function() { 
    delay(function() { 
     if (input).val() !== '' && $(input).val() !== $(input).attr('searchString')) { 
      // make the AJAX call at this time 
      // Store the value sent so we can compare when JSON returns 
      $(input).attr('searchString', $(input).val()); 

      namepicker2_Search_Prep(input); 
     } 
    }, 500); 
}); 

वर्तमान स्ट्रिंग भंडारण करके आप देखने के लिए कि उपयोगकर्ता के टाइपिंग बंद कर दिया है सकते हैं:

$(input).live('keyup', function(e) { 
    if (!$(input).hasClass("outRunningAJob")) { 
     var xx = $(input).val(); 
     $(input).addClass("outRunningAJob"); 
     doSearch(xx); 
     $(input).delay(400).queue(function() { 
      $(this).removeClass("outRunningAJob"); 
      $(this).dequeue(); 
     }); 
    } 
}); 
+0

एक कामकाज की तरह लगता है ... @ Flöcsy द्वारा प्रदान किया गया उत्तर अधिक सीधे आगे है। ps क्या बाहर है RunningAJob :) – Youss

+0

मैं व्यक्तिगत रूप से अभी तक 'टाइमआउट' कार्यों के साथ सहज नहीं हुआ हूं और इसलिए मैंने सोचा कि शायद आप इसी जगह पर थे क्योंकि आप इसके बारे में पूछ रहे हैं। क्या यह एक कामकाज है? इस प्रकार मैं वर्तमान में समस्या से संपर्क करूंगा। यदि आप वर्तमान में 'देरी' का उपयोग करने से अधिक परिचित हैं तो यह एक बेहतर समाधान हो सकता है (एक रखरखाव सम्मान में)। 'outRunningAJob' सिर्फ मनमानी लेकिन स्वयं दस्तावेज है। खुशी है की आपको पसंद आया :-) – veeTrain

0

मैं लागू करना आसान निम्नलिखित पाया। फिर आप अपने फ़ंक्शन को सुरक्षित रूप से ऐसा करने के लिए कॉल कर सकते हैं जो कभी भी प्रसंस्करण की आवश्यकता होती है।