2008-12-11 22 views
10

टाइप कर रहा है, मैं एक खोज बॉक्स (इनपुट फ़ील्ड) बना रहा हूं, जिसे सर्वर पर एक ग्रिड फ़िल्टर करने के लिए सर्वर कॉल करना चाहिए, लेकिन मुझे इसे एक स्मार्ट तरीके से बनाना होगा, मुझे इसकी आवश्यकता है केवल सर्वर कॉल को आग लगाना अगर उपयोगकर्ता बंद हो गया है। अभी मैं इसे लागू करने की कोशिश कर रहा हूं, लेकिन अगर कोई जानता है कि इसे कैसे किया जाए तो मैं बहुत खुश हूं। वैसे भी, अगर मैं इसे पहले करता हूं तो मैं यहां जवाब पोस्ट करूंगा ... बेस्ट विनर्ड्स, जैम।निर्धारित करें कि कोई उपयोगकर्ता

उत्तर

23
  1. जब एक कुंजी दबाने:
    1. चेक एक मौजूदा घड़ी हो, तो - इसे रोकने के अगर कोई हो
    2. एक टाइमर शुरू करते हैं।
  2. जब टाइमर समाप्त हो जाता है, तो सर्वर विधि को कॉल करें।
var searchTimeout; 
document.getElementById('searchBox').onkeypress = function() { 
    if (searchTimeout != undefined) clearTimeout(searchTimeout); 
    searchTimeout = setTimeout(callServerScript, 250); 
}; 
function callServerScript() { 
    // your code here 
} 
+0

यकीन है कि टाइमर लेकिन जब तक आप ताकि आप छोटे रुक जाता है पकड़ने के न 'टाइप किया' पर विचार की देरी है रहो। वैकल्पिक रूप से, जब उपयोगकर्ता टेक्स्टबॉक्स से बाहर क्लिक करता है तो यह देखने के लिए ऑनब्लूर ईवेंट का उपयोग करें। – Karl

+0

हाँ, देरी कैसे गहन देखने है, आप कैसे उत्तरदायी चाहते हैं कि उसे होना करने के लिए पर निर्भर होना चाहिए, और यह भी: कितनी तेजी से अपने उपयोगकर्ताओं को सामान्य रूप से लिखें। मैंने एक खोज के लिए 250 एमएमएस का उपयोग किया है और यह ठीक आईएमओ रहा है। – nickf

+0

घटना onkeypress नहीं हो, या ऐसा ही कुछ करना चाहिए? –

0

मैं जावास्क्रिप्ट के बारे में ज्यादा पता नहीं है, लेकिन आप एक टाइमर (5 सेकंड के लिए सेट करें बोलें की सुविधा देता है) कि आपके इनपुट बॉक्स के हर बदलाव घटना पर रीसेट हो जाता है इस्तेमाल कर सकते हैं। यदि उपयोगकर्ता 5 सेकंड से अधिक समय तक टाइपिंग बंद कर देता है, तो टाइमर समाप्त हो जाता है और जमा को ट्रिगर करता है।

उस दृष्टिकोण के साथ समस्या यह है कि जमा हर विराम पर ट्रिगर होता है, उदा। यदि उपयोगकर्ता कॉफी ब्रेक करने के लिए टाइपिंग बंद कर देता है। आपको देखना होगा कि यह उपयोगकर्ताओं के लिए स्वीकार्य है या नहीं।

5

आप setTimeout अपने सर्वर समारोह (एक हो सकता है 2-3 सेकंड की देरी के साथ) एक कुंजी दबाने घटना पर कॉल करने के लिए कॉल इस्तेमाल कर सकते हैं। जैसे ही एकी दबाया जाता है, पिछले setTimeout कॉल को रद्द करें और एक नया बनाएं।

फिर, कोई भी कुंजीपटल के साथ 2-3 सेकंड बीत चुके हैं, सर्वर ईवेंट निकाल दिया जाएगा।

+0

हेहे ... आप चालाक शैतान निकफ! आप मुझसे भी तेज टाइप करते हैं। –

+0

मुहहाह :) आपको लगता है कि मुझे * जानना * चीजों से यह प्रतिनिधि स्तर मिला है? हां! – nickf

+0

हेहे ... आप कम से कम मुझे सांत्वना में उखाड़ फेंक सकते हैं: डी सब के बाद, मैंने * इसे * पता किया, और मेरा जवाब * सहायक है। –

0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं कोड के इस टुकड़े को लागू किया था और यह है कि यह काम (jQuery का उपयोग) करता है लगता है:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<script src="jquery.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    var interval = 500; 
    var filterValue = ""; 
    $(document).ready(function() { 
     $(".txtSearch").bind("keypress", logKeyPress); 
    }); 
    function logKeyPress() { 
     var now = new Date().getTime(); 
     var lastTime = this._keyPressedAt || now; 
     this._keyPressedAt = now; 
     if (!this._monitoringSearch) { 
      this._monitoringSearch = true; 
      var input = this; 
      window.setTimeout(
       function() { 
        search(input); 
       }, 0); 
     } 
    } 
    function search(input) { 
     var now = new Date().getTime(); 
     var lastTime = input._keyPressedAt; 
     if ((now - lastTime) > interval) { 
      /*console.log(now); 
      console.log(lastTime); 
      console.log(now - lastTime);*/ 
      if (input.value != filterValue) { 
       filterValue = input.value; 
       //console.log("search!"); 
       alert("search!"); 
      } 
      input._monitoringSearch = false; 
     } 
     else { 
      window.setTimeout(
       function() { 
        search(input); 
       }, 0); 
     } 
    } 
</script> 

+0

के लिए दयालुता क्षमा करें, लेकिन मुझे नहीं लगता कि यह करने का एक बहुत अच्छा तरीका है ... क्या यह लगातार अंतराल तक खोज() को ऊपर और ऊपर कॉल नहीं करेगा? – nickf

+0

नहीं, यह तब बंद हो जाएगा जब आखिरी बार एक कुंजी दबाया गया था और वर्तमान समय> * अंतराल * चर (खराब नाम मुझे पता है) के बीच का अंतर। अपने आप से कोशिश करो। –

2

यहाँ एक सरल है जिस तरह से jQuery के बिना काम करेगा:

<input type="text" id="TxtSearch" onchange="countDown=10;" /> 

<script type="text/javascript"> 

var countDown = 0; 
function SearchTimerTick() 
{ 
    if(countDown == 1) 
    { 
     StopTypingCommand(); 
     countDown = 0; 
    } 

    if(countDown > 0) 
     countDown--; 
} 

window.setInterval(SearchTimerTick,1000); 

</script> 
1

तुम भी शायद इनपुट बॉक्स पर स्ट्रिंग की लंबाई की जांच करना चाहते हैं, अन्यथा एक विशाल परिणाम सेट लौटने का खतरा!

+0

बहुत सच्चा बिंदु - हालांकि यह शायद सर्वर-साइड किया जा सकता है। निश्चित रूप से एक खाली स्ट्रिंग के लिए जांच करें। – nickf

+0

आपकी टिप्पणी के लिए धन्यवाद, असली एप्लिकेशन में एक खाली बॉक्स एक वैध मानदंड फ़िल्टर है (इसका मतलब है * मुझे सबकुछ दिखाएं *), मैं परिणाम पेजिंग कर रहा हूं इसलिए कोई ओवरहेड नहीं है। –

संबंधित मुद्दे