टाइपिंग / लेखन बंद करने के बाद इनपुट पाठ में किसी घटना को कैसे ट्रिगर किया जाए?


84

मैं अपने इनपुट टेक्स्टबॉक्स में वर्णों को टाइप करने के बाद (टाइप करते समय नहीं) को रोकना चाहता हूं।

मैंने कोशिश की है:

$('input#username').keypress(function() {
    var _this = $(this); // copy of this object for further usage

    setTimeout(function() {
        $.post('/ajax/fetch', {
            type: 'username',
            value: _this.val()
        }, function(data) {
            if(!data.success) {
                // continue working
            } else {
                // throw an error
            }
        }, 'json');
    }, 3000);
});

लेकिन यह उदाहरण हर टाइप किए गए कैरेक्टर के लिए एक टाइमआउट पैदा करता है और मुझे 20 कैरेक्टर में टाइप करने पर 20 AJAX रिक्वेस्ट मिलती हैं।

इस बेला पर मैं एक AJAX के बजाय एक साधारण चेतावनी के साथ एक ही समस्या प्रदर्शित करता हूं।

क्या इसके लिए कोई समाधान है या मैं सिर्फ इसके लिए एक खराब दृष्टिकोण का उपयोग कर रहा हूं?


1
मुझे डर है कि जावास्क्रिप्ट एक घटना प्रदान नहीं करता है जो आपको सूचित करने की अनुमति देगा जब उपयोगकर्ता एक इनपुट क्षेत्र में टाइप करना बंद कर देता है। आपको इसकी आवश्यकता क्यों है?
डारिन दिमित्रोव

3
क्या यह उदाहरण से स्पष्ट नहीं है? मैं एक घटना को ट्रिगर करना चाहता हूं "जब 20 अनुरोध भेजने के बजाय" अंतिम-उपयोगकर्ता इसमें टाइप करना बंद कर देता है "

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

14
ऊपर की टिप्पणियाँ मूर्खतापूर्ण हैं। यह एक सामान्य उपयोग का मामला है: मैं एक घटना चाहता हूं, जब उपयोगकर्ता अपनी खिड़की का आकार बदल रहा है, मानचित्र को ज़ूम कर रहा है, खींच रहा है, टाइप कर रहा है ... मूल रूप से उपयोगकर्ता के हिस्से पर किसी भी निरंतर कार्रवाई को हमारे डिजिटल ब्रह्मांड में अनुवादित करने की आवश्यकता है। यहां तक ​​कि एक भी कीस्ट्रोकेक इस समस्या से ग्रस्त है: जब आप एक कुंजी को मारते हैं, तो यह वास्तव में "बाउंस" करता है, जिससे न केवल 1 कीस्ट्रोक घटना होती है, बल्कि कई। आपके कंप्यूटर का हार्डवेयर या OS इन अतिरिक्त घटनाओं को हटा देता है, और इसीलिए हमें असतत कीस्ट्रोक घटनाओं का भ्रम होता है। इसे "डिबगिंग" कहा जाता है, और यह वही है जो ओपी को चाहिए।
जिग्गी

उपयोगकर्ताओं की प्रतिक्रिया के लिए चेतावनी: stackoverflow.com/a/28046731/57883
मस्लो

जवाबों:


172

आपको setTimeout(जैसे आप हैं) का उपयोग करना होगा, लेकिन संदर्भ को भी संग्रहीत करें ताकि आप सीमा को रीसेट कर सकें। कुछ इस तरह:

//
// $('#element').donetyping(callback[, timeout=1000])
// Fires callback when a user has finished typing. This is determined by the time elapsed
// since the last keystroke and timeout parameter or the blur event--whichever comes first.
//   @callback: function to be called when even triggers
//   @timeout:  (default=1000) timeout, in ms, to to wait before triggering event if not
//              caused by blur.
// Requires jQuery 1.7+
//
;(function($){
    $.fn.extend({
        donetyping: function(callback,timeout){
            timeout = timeout || 1e3; // 1 second default timeout
            var timeoutReference,
                doneTyping = function(el){
                    if (!timeoutReference) return;
                    timeoutReference = null;
                    callback.call(el);
                };
            return this.each(function(i,el){
                var $el = $(el);
                // Chrome Fix (Use keyup over keypress to detect backspace)
                // thank you @palerdot
                $el.is(':input') && $el.on('keyup keypress paste',function(e){
                    // This catches the backspace button in chrome, but also prevents
                    // the event from triggering too preemptively. Without this line,
                    // using tab/shift+tab will make the focused element fire the callback.
                    if (e.type=='keyup' && e.keyCode!=8) return;
                    
                    // Check if timeout has been set. If it has, "reset" the clock and
                    // start over again.
                    if (timeoutReference) clearTimeout(timeoutReference);
                    timeoutReference = setTimeout(function(){
                        // if we made it here, our timeout has elapsed. Fire the
                        // callback
                        doneTyping(el);
                    }, timeout);
                }).on('blur',function(){
                    // If we can, fire the event since we're leaving the field
                    doneTyping(el);
                });
            });
        }
    });
})(jQuery);

$('#example').donetyping(function(){
  $('#example-output').text('Event last fired @ ' + (new Date().toUTCString()));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<input type="text" id="example" />
<p id="example-output">Nothing yet</p>

कि कब निष्पादित होगा:

  1. समय समाप्त हो गया है, या
  2. उपयोगकर्ता स्विच किए गए फ़ील्ड ( blurईवेंट)

(जो भी पहले आता है)


1
हाँ, यह मेरी रात बचाता है। साभार
नौसिखिया

2
@ ब्रैड: इनपुट बॉक्स में टाइप किए गए बैकस्पेस कुंजी को छोड़कर यह jquery समाधान ठीक काम करता है जो नवीनतम क्रोम (38.0.2125.111) में नहीं पाया गया है। केवल इसे keyupकाम करने के लिए बदल रहा है । आप इसका निरीक्षण करना चाहते हैं और कोड को उचित रूप से संशोधित कर सकते हैं।
पाल्टेड

1
@palerdot: जानकर अच्छा लगा, धन्यवाद। मैं इस पर गौर करूंगा और किसी भी बदलाव को वापस लूंगा।
ब्रैड क्रिस्टी

3
इस प्लगइन के लिए धन्यवाद - महान काम करता है। मुझे एक समायोजन करना पड़ा, क्योंकि यह तब काम करेगा जब किसी ने इनपुट क्षेत्र में कुछ चिपकाया हो। मैंने निम्नलिखित लाइन को शामिल करने के लिए संपादित किया paste -$el.is(':input') && $el.on('keyup keypress paste',function(e){
मैट

1
@ Sangar82: अब (हालांकि मैं थोड़ा उलझन में हूँ, ctrl + v को कीपर द्वारा कैप्चर किया जाना चाहिए - जब तक कि आप राइट-क्लिक नहीं कर रहे हैं-> चिपकाने?
ब्रैड क्रिस्टी

71

समाधान:

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

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

प्रयोग

$('input').keyup(function() {
  delay(function(){
    alert('Hi, func called');
  }, 1000 );
});

1
user1386320 - इस समाधान की जांच करें मेरे पास समान मुद्दा है, और मुझे यह काम कर रहा है। आप अलर्ट के स्थान पर अपना कोड जोड़ेंगे ()।
अता उल मुस्तफा

धन्यवाद। अच्छी तरह से काम करता है।
user1919

2
क्या मैं एन + अप वोट जोड़ सकता हूं? जावास्क्रिप्ट क्लोजर का उपयोग करके यह समाधान शानदार, छोटा और सुरुचिपूर्ण है।
Matteo Conta

1
@ मत्तेतेकांटा, धन्यवाद :)
अता उल मुस्तफा

1
मैं इसके लिए सिर्फ अपने पृष्ठ पर अंडरस्कोर शामिल नहीं करना चाहता था। आपका समाधान सही काम करता है! धन्यवाद
Skoempie

17

आप underscore.js "पराजय" का उपयोग कर सकते हैं

$('input#username').keypress( _.debounce( function(){<your ajax call here>}, 500 ) );

इसका मतलब यह है कि आपका फ़ंक्शन कॉल एक कुंजी दबाने के 500ms के बाद निष्पादित करेगा। लेकिन अगर आप 500ms से पहले एक और कुंजी दबाते हैं (एक अन्य कीप ईवेंट को निकाल दिया जाता है), तो पिछले फ़ंक्शन निष्पादन को अनदेखा (बहस) किया जाएगा और नया एक ताज़ा 500ms टाइमर के बाद निष्पादित होगा।

अतिरिक्त जानकारी के लिए, _.debounce (फंक, टाइमर, ट्रू ) का उपयोग करने का मतलब होगा कि पहला फ़ंक्शन निष्पादित करेगा और बाद में 500ms की टाइमर के साथ अन्य सभी कीपर घटनाओं को अनदेखा किया जाएगा।


बहुत उपयोगी और छोटा है अगर आपके पास पहले से ही एक दायित्व के रूप में अंडरस्कोर है।
फ्रांसेस्को पासा

10

आप बहस की जरूरत है!

यहाँ एक jQuery प्लगइन है , और यहाँ आपको बहस के बारे में जानने की आवश्यकता है । अगर आप Google से यहां आ रहे हैं और अंडरस्कोर ने अपने ऐप के JSoup में अपना रास्ता खोज लिया है, तो इसमें राइट बेक किया गया है !


6

साफ समाधान:

$.fn.donetyping = function(callback, delay){
  delay || (delay = 1000);
  var timeoutReference;
  var doneTyping = function(elt){
    if (!timeoutReference) return;
    timeoutReference = null;
    callback(elt);
  };

  this.each(function(){
    var self = $(this);
    self.on('keyup',function(){
      if(timeoutReference) clearTimeout(timeoutReference);
      timeoutReference = setTimeout(function(){
        doneTyping(self);
      }, delay);
    }).on('blur',function(){
      doneTyping(self);
    });
  });

  return this;
};

5

आपको setTimeoutएक वैरिएबल को असाइन करना चाहिए और clearTimeoutइसे कीपर पर क्लियर करने के लिए उपयोग करना चाहिए ।

var timer = '';

$('input#username').keypress(function() {
  clearTimeout(timer);
  timer = setTimeout(function() {
    //Your code here
  }, 3000); //Waits for 3 seconds after last keypress to execute the above lines of code
});

बेला

उम्मीद है की यह मदद करेगा।


3

वहाँ कुछ सरल प्लगइन मैंने बनाया है कि exacly करता है। इसे प्रस्तावित समाधानों की तुलना में बहुत कम कोड की आवश्यकता है और यह बहुत हल्का है (~ 0,6kb)

पहले आप किसी भी समय Bidहो सकता है की तुलना में वस्तु बनाते हैं bumped। हर टक्कर अगले समय के लिए दिए गए समय के लिए बोली कॉलबैक फायरिंग में देरी करेगी ।

var searchBid = new Bid(function(inputValue){
    //your action when user will stop writing for 200ms. 
    yourSpecialAction(inputValue);
}, 200); //we set delay time of every bump to 200ms

जब Bidवस्तु तैयार होती है, तो हमें bumpकिसी तरह इसकी आवश्यकता होती है। के लिए bumping देते हैं keyup event

$("input").keyup(function(){
    searchBid.bump( $(this).val() ); //parameters passed to bump will be accessable in Bid callback
});

यहाँ क्या होता है:

प्रत्येक उपयोगकर्ता अगली बार 200ms के लिए कुंजी दबाता है, बोली 'विलंबित' (टकराती) है। यदि 200 मी 'फिर से' टकराए बिना गुजरेंगे, तो कॉलबैक निकाल दिया जाएगा।

इसके अलावा, आपको बोली रोकने के लिए 2 अतिरिक्त फ़ंक्शंस मिले हैं (यदि उपयोगकर्ता ने esc दबाया है या उदाहरण के लिए बाहर इनपुट पर क्लिक किया है) और तुरंत कॉलबैक को समाप्त और फायरिंग के लिए (उदाहरण के लिए जब उपयोगकर्ता प्रेस कुंजी दर्ज करता है):

searchBid.stop();
searchBid.finish(valueToPass);

1

मैं एक साधारण HTML / JS कोड खोज रहा हूं और मुझे कोई नहीं मिला। फिर, मैंने नीचे दिए गए कोड का उपयोग करके लिखा onkeyup="DelayedSubmission()"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
<head><title>Submit after typing finished</title>
<script language="javascript" type="text/javascript">
function DelayedSubmission() {
    var date = new Date();
    initial_time = date.getTime();
    if (typeof setInverval_Variable == 'undefined') {
            setInverval_Variable = setInterval(DelayedSubmission_Check, 50);
    } 
}
function DelayedSubmission_Check() {
    var date = new Date();
    check_time = date.getTime();
    var limit_ms=check_time-initial_time;
    if (limit_ms > 800) { //Change value in milliseconds
        alert("insert your function"); //Insert your function
        clearInterval(setInverval_Variable);
        delete setInverval_Variable;
    }
}

</script>
</head>
<body>

<input type="search" onkeyup="DelayedSubmission()" id="field_id" style="WIDTH: 100px; HEIGHT: 25px;" />

</body>
</html>

0

जब आप सिर्फ एक घड़ी को रीसेट करना चाहते हैं, तो ऐसा क्यों करें?

var clockResetIndex = 0 ;
// this is the input we are tracking
var tarGetInput = $('input#username');

tarGetInput.on( 'keyup keypress paste' , ()=>{
    // reset any privious clock:
    if (clockResetIndex !== 0) clearTimeout(clockResetIndex);

    // set a new clock ( timeout )
    clockResetIndex = setTimeout(() => {
        // your code goes here :
        console.log( new Date() , tarGetInput.val())
    }, 1000);
});

यदि आप वर्डप्रेस पर काम कर रहे हैं, तो आपको यह सब कोड एक jQuery ब्लॉक के अंदर लपेटने की आवश्यकता है:

jQuery(document).ready(($) => {
    /**
     * @name 'navSearch' 
     * @version 1.0
     * Created on: 2018-08-28 17:59:31
     * GMT+0530 (India Standard Time)
     * @author : ...
     * @description ....
     */
        var clockResetIndex = 0 ;
        // this is the input we are tracking
        var tarGetInput = $('input#username');

        tarGetInput.on( 'keyup keypress paste' , ()=>{
            // reset any privious clock:
            if (clockResetIndex !== 0) clearTimeout(clockResetIndex);

            // set a new clock ( timeout )
            clockResetIndex = setTimeout(() => {
                // your code goes here :
                console.log( new Date() , tarGetInput.val())
            }, 1000);
        });
});

यदि आप jquery का विस्तार करना चाहते हैं और कई इनपुट तत्वों में इस पद्धति का उपयोग करना चाहते हैं, तो स्वीकृत उत्तर वह उत्तर है जिसकी आप तलाश कर रहे हैं।
15

0

<input>अपने html में विशेषता onkeyup = "myFunction ()" का उपयोग करें।


-1

मेरी सोच में एक उपयोगकर्ता लिखना बंद कर देता है जब वह उस इनपुट पर ध्यान केंद्रित नहीं करता है। इसके लिए आपके पास "ब्लर" नामक एक फ़ंक्शन है जो सामान की तरह करता है


4
गलत! धब्बा एक ऐसी घटना है जब किसी विशेष इनपुट फ़ील्ड पर फ़ोकस खो जाता है। जब कीबोर्ड उस क्षेत्र में उपयोग में नहीं होता है जिस पर मैं एक घटना को ट्रिगर करने की कोशिश कर रहा हूं, तो मुझे यह निर्धारित करने की आवश्यकता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.