2010-03-21 16 views
5

टाइप करना बंद कर दिया है तो प्रोसेसिंग करें मेरे पास एक वेब पेज पर एक टेक्स्ट बॉक्स है, जिसका मूल्य मैं XMLHttpRequest को भेजना चाहता हूं। अब मैं चाहता हूं कि उपयोगकर्ता बटन दबाए बिना मूल्य टाइप करें। लेकिन अगर मैं सिर्फ कीबोर्ड की घटनाओं को अनुरोध भेजता हूं, तो हर बार एक कुंजी दबाए जाने पर यह आग लग जाएगी।जावास्क्रिप्ट: जब उपयोगकर्ता ने

तो बुनियादी तौर पर मैं liek इस

function KeyUpEvent() 
{ 
    if (user is still typing) 
    return; 
    else 
    //do processing 
} 

कुछ यह बहुत अच्छा होगा अगर समाधान सादे से आ सकता है चाहता हूँ जावास्क्रिप्ट या mootools। मैं किसी अन्य पुस्तकालय का उपयोग नहीं करना चाहता।

+0

एक टाइमर कभी पर्याप्त नहीं होगा। जब भी आप अपना टाइमआउट चुनते हैं तो उपयोगकर्ता आसानी से विचलित हो सकता है या धीमा टाइप कर सकता है। मेरा समाधान एकमात्र उचित समाधान है और यह है कि उपयोगकर्ता फ़ील्ड के साथ कैसे बातचीत करने की उम्मीद करते हैं और इसके लिए किसी भी बटन की आवश्यकता नहीं होती है। यदि आप मूल्य की लंबाई नहीं जानते हैं, तो आपको पता नहीं है कि उपयोगकर्ता किया गया है या नहीं। तो फिर आप उस मूल्य को ट्रांसमिट करने का जोखिम लेते हैं जिसे उपयोगकर्ता नहीं चाहता था या उम्मीद नहीं करता था और उनका अनुभव बस आपके टाइमर द्वारा निराश होता है, न बढ़ाया जाता है। जब यूआई अनुभव की बात आती है, तो आप मानक उपयोग परिदृश्यों के साथ चिपकने से बेहतर होते हैं। – nicerobot

उत्तर

9

आमतौर पर जिस तरह से किया जाता है वह keyup ईवेंट पर टाइमर को पुनरारंभ करके होता है। कुछ ऐसा:

var keyupTimer; 
function keyUpEvent(){ 
    clearTimeout(keyupTimer); 
    keyupTimer = setTimeout(sendInput,1000); // will activate when the user has stopped typing for 1 second 
} 

function sendInput(){ 
    alert("Do AJAX request"); 
} 
+0

आप कीप भूल रहे हैं, क्या होगा यदि उन्होंने 30 सेकंड में फिर से टाइप करना शुरू किया? आपकी घटना अभी भी –

+1

को आग लगती है जो वैध उत्तर नहीं है, जो ईवेंट को [0 वर्णित वर्णों की संख्या] आग लग जाएगी] –

9

असल में, आप कीप पर टाइमर शुरू करना चाहते हैं, और जब कीप फिर से शुरू होता है, टाइमर रीसेट करें। जब उपयोगकर्ता टाइपिंग बंद कर देता है, टाइमर समाप्त हो जाता है, और आपका अनुरोध उस बिंदु पर जा सकता है।

उदाहरण:

var timout_id; 

function keyup_handler(event) { 
    if (timout_id) { 
    clearTimeout(timout_id); 
    } 

    timout_id = setTimeout(function(){ 
    alert('sending data: \n' + event.target.value) 
    }, 800); 
} 

सिर्फ अपने पसंदीदा तरीका का उपयोग करने के समारोह देते हैं, और अपना पसंदीदा कार्रवाई के साथ alert बदलें।

बेशक आप इस दृष्टिकोण को सामान्यीकृत कर सकते हैं और इसे अधिक पुन: प्रयोज्य बना सकते हैं, लेकिन मुझे लगता है कि यह मूल विचार को दर्शाता है।

2

आप कभी नहीं जानते कि उपयोगकर्ता वास्तव में "समाप्त" टाइपिंग कब होता है। उपयोगकर्ता एक छींक तोड़ सकता है, या एक खिंचाव तोड़ सकता है, या एक कॉफी तोड़, और फिर टाइपिंग जारी रखें।

हालांकि, यदि आप एक स्वत: पूर्ण तंत्र की तरह कुछ लागू कर रहे हैं, तो आप यह देखने के लिए टाइमर (सीएफ window.setTimeout(...)) सेट कर सकते हैं कि उपयोगकर्ता ने कुछ समय में कुछ भी टाइप नहीं किया है या नहीं। यदि टाइमर चल रहा है, तो आपको एक और कुंजी-अप ईवेंट मिलता है, तो आप टाइमर को शुरू कर सकते हैं।

-1

ऑनब्लूर और शायद ऑन-ऑनडाउन का उपयोग करें ताकि उपयोगकर्ता वापसी/एंटर कुंजी दबाए।

+0

गंभीरता से !? जब उपयोगकर्ता को टाइप किया जाता है तो यह जानने का एकमात्र वास्तविक साधन यह है कि यह नीचे मतदान कर रहा है ?! यही है, उन्होंने क्षेत्र छोड़ दिया है या एक कुंजी दबाया है जो वे प्रस्तुत करना चाहते हैं। अन्यथा, जानने का कोई तरीका नहीं है। टाइमर नहीं है क्योंकि वे बस विचलित हो सकते हैं। – nicerobot

5

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

var typewatch = (function(){ 
    var timer = 0; 
    return function(callback, ms){ 
    clearTimeout (timer); 
    timer = setTimeout(callback, ms); 
    } 
})(); 

उपयोग (MooTools साथ उदाहरण):

$('textInput').addEvent('keyup', function(e){ 
    typewatch(function() { 
    // executed only 500 ms after the last keyup event 
    // make Ajax request 
    }, 500); 
}); 

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

1
var keyTimer; 
function onKeyUp(){ 
clearTimeout(keyTimer); 
setTimeout(stoppedTyping,1500); 
} 
function stoppedTyping(){ 
// Profit! $$$ 
} 

संपादित करें: अरे निंजा

0

मैं एक कस्टम jQuery घटना लिखा था क्योंकि मैं इस तर्क एक बहुत का उपयोग करें:

jQuery.event.special.stoppedtyping = { 
    setup: function(data, namespaces) { 
    jQuery(this).bind('keyup', jQuery.event.special.stoppedtyping.keyuphandler); 
    }, 
    teardown: function(namespaces) { 
    jQuery(this).bind('keyup', jQuery.event.special.stoppedtyping.keyuphandler); 
    }, 
    keyuphandler: function(e) { 
    var interval = 1000; 
    var el = this; 

    if (jQuery.data(this, 'checklastkeypress') != null) { 
     clearTimeout(jQuery.data(this, 'checklastkeypress')); 
    } 

    var id = setTimeout(function() { 
     jQuery(el).trigger('stoppedtyping'); 
    }, interval); 
    jQuery.data(this, 'checklastkeypress', id); 
    } 
}; 

आप इस तरह इसका इस्तेमाल कर सकते हैं:

$('input.title').bind('stoppedtyping', function() { 
    // run some ajax save operation 
}); 

किसी कारण से मैं इसे कभी भी काम नहीं कर सकता। लाइव (...)। मुझे यकीन नहीं है कि क्यों ...

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