আমি টাইপ / লেখা বন্ধ করার পরে কীভাবে ইনপুট পাঠ্যে কোনও ইভেন্ট ট্রিগার করব?


85

আমি আমার ইনপুট পাঠ্যবক্সে অক্ষর (টাইপ করার সময় নয়) বন্ধ করা ঠিক করার পরেই একটি ইভেন্টটি ট্রিগার করতে চাই।

আমি চেষ্টা করেছি:

$('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 অনুরোধগুলি পাই।

এই কোলাহলটিতে আমি এজেএক্সের পরিবর্তে একটি সাধারণ সতর্কতা দিয়ে একই সমস্যাটি প্রদর্শন করি।

এর কোনও সমাধান আছে বা আমি কেবল এর জন্য একটি খারাপ দৃষ্টিভঙ্গি ব্যবহার করছি?


4
আমি আশঙ্কা করছি যে জাভাস্ক্রিপ্ট কোনও ইভেন্ট সরবরাহ করে না যা ব্যবহারকারী যখন কোনও ইনপুট ক্ষেত্রে টাইপ করা বন্ধ করে দেয় তখন আপনাকে অবহিত করার অনুমতি দেয়। তোমার এতো দরকার কেন?
দারিন দিমিত্রভ

4
উদাহরণ থেকে স্পষ্ট হয় না? আমি "শেষ ব্যবহারকারী এটিকে টাইপ স্টপ যখন", পরিবর্তে 20 অনুরোধ পাঠানোর একটি ইভেন্ট ট্রিগার করতে চান

4
ম্যানুয়ালি ক্ষেত্রগুলি জমা দেওয়া বা ক্ষেত্র পরিবর্তন না করা পর্যন্ত ব্যবহারকারী আসলে টাইপিংয়ের কাজটি করার কোনও উপায় নেই। আপনি কীভাবে জানবেন যে ব্যবহারকারী মাঝারি বাক্যে বিরতি দেয় এবং আরও টাইপ করার আগে 5 মিনিটের জন্য অপেক্ষা করে? সম্ভাব্য সমাধান হ'ল .blur () ব্যবহার করা এবং যখন ব্যবহারকারীরা ক্ষেত্রটি ছেড়ে যায় তখন প্রেরণ send
কেভিন এম

14
উপরের মন্তব্যগুলি নির্বোধ। এটি একটি সাধারণ ব্যবহারের ক্ষেত্রে: আমি যখন একটি উইন্ডোটি তার উইন্ডোটির আকার পরিবর্তন করে, মানচিত্রটি জুম করে, টেনে আনে, টাইপ করে যাচ্ছি তখন আমি একটি ইভেন্ট চাই ... মূলত ব্যবহারকারীর অংশে যে কোনও ক্রমাগত ক্রিয়া আমাদের ডিজিটাল মহাবিশ্লে অনুবাদ করা দরকার। এমনকি একটি কী-স্ট্রোকও এই সমস্যায় ভুগছে: আপনি যখন কোনও কী আঘাত করেন, তখন এটি আসলে "বাউন্স" করে, কেবল 1 টি কীস্ট্রোক ইভেন্ট নয়, অনেকগুলি তৈরি করে। আপনার কম্পিউটারের হার্ডওয়্যার বা ওএস এই অতিরিক্ত ইভেন্টগুলি সরিয়ে দেয় এবং সে কারণেই আমাদের কাছে বিচ্ছিন্ন কীস্ট্রোক ইভেন্টের মায়া আছে। এটিকে "ডিবাউসিং" বলা হয়, এবং এটিই ওপির প্রয়োজন needs
জিগি

প্রতিক্রিয়া ব্যবহারকারীদের জন্য সতর্কতা: 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ইভেন্ট) স্যুইচ করেছেন

(যেটা আসে প্রথমে)


4
হ্যাঁ এই আমার রাত বাঁচায়। ধন্যবাদ
নবাগত

4
@ ব্র্যাড: ইনপুট বাক্সে টাইপ করা ব্যাকস্পেস কীটি সর্বশেষ ক্রোমের (38.0.2125.111) সনাক্ত না করা ব্যতীত এই জ্যাকোরি সলিউশনটি দুর্দান্ত কাজ করে। কেবল এটি keyupকাজ করে। আপনি এটি পরিদর্শন করতে এবং কোডটি যথাযথভাবে সংশোধন করতে চাইতে পারেন।
প্যালারডট

4
@ প্যালার্ডোট: জেনে রাখা ভাল, আপনাকে ধন্যবাদ আমি এটি সন্ধান করব এবং কোনও পরিবর্তন ফিরে পোস্ট করব।
ব্র্যাড ক্রিস্টি

4
এই প্লাগইনটির জন্য ধন্যবাদ - দুর্দান্ত কাজ করে। আমাকে একটি সমন্বয় করতে হয়েছিল, কারণ কেউ যখন ইনপুট ক্ষেত্রে কোনও কিছু আটকে দেয় তখন এটি কাজ করবে না। আমি অন্তর্ভুক্ত করতে নিম্নলিখিত লাইনটি সম্পাদনা করেছি paste -$el.is(':input') && $el.on('keyup keypress paste',function(e){
ম্যাট

4
@ সাঙ্গর ৮২: এখনই কি (যদিও আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি, সিটিআরএল + ভি কিপ্রেস দ্বারা বন্দী করা উচিত - যদি না আপনি ডান ক্লিক করেন>> আটকান?
ব্র্যাড ক্রিস্টি

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 );
});

4
ব্যবহারকারী 1386320 - আমার অনুরূপ সমস্যা রয়েছে এই সমাধানটি পরীক্ষা করে দেখুন এবং এটি কাজ করে চলেছি। আপনি সতর্কতার জায়গায় আপনার কোড যুক্ত করবেন ()।
আতা উল মুস্তফা

ধন্যবাদ সুন্দরভাবে কাজ করে।
ব্যবহারকারী 1919

4
আমি কি এন + আপ ভোট যুক্ত করতে পারি? এই সমাধানটি জাভাস্ক্রিপ্ট বন্ধ ব্যবহার করে উজ্জ্বল, সংক্ষিপ্ত এবং মার্জিত।
মাত্তিও কন্টা

4
@ মাট্টিওকন্টা, আপনাকে ধন্যবাদ :)
আতা উল মুস্তফা

4
আমি কেবল এই জন্য আমার পৃষ্ঠায় আন্ডারস্কোর.জেগুলি অন্তর্ভুক্ত করতে চাই না। আপনার সমাধান নিখুঁত কাজ করে! ধন্যবাদ
স্কোইম্পি

17

আপনি আন্ডারস্কোর.জেএস ব্যবহার করতে পারেন "ডিবাউন"

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

এর অর্থ হ'ল আপনার ফাংশন কলটি কী টিপানোর 500 মিমি পরে কার্যকর করবে। তবে যদি আপনি 500 মিমি এর আগে অন্য কী (অন্য কীপ্রেস ইভেন্টটি বহিস্কার করা হয়) টিপেন, তবে পূর্ববর্তী ফাংশনটি কার্যকর করা উপেক্ষা করা হবে (ঘোষিত) এবং নতুনটি একটি 500 মিমি টাইমার পরে চালিত হবে।

অতিরিক্ত তথ্যের জন্য, _.ডেবাউন্স (ফানক, টাইমার, ট্রু ) ব্যবহারের অর্থ হ'ল প্রথম ফাংশনটি কার্যকর হবে এবং পরবর্তী 500 মিমি টাইমার সহ সমস্ত অন্যান্য কীপ্রেস ইভেন্টগুলি উপেক্ষা করা হবে।


আপনি ইতিমধ্যে একটি lib হিসাবে আন্ডারস্কোর থাকলে খুব দরকারী এবং সংক্ষিপ্ত।
ফ্রান্সেস্কো পাসা

10

আপনার আত্মপ্রকাশ দরকার!

এখানে একটি জিকুয়েরি প্লাগইন রয়েছে এবং এটির জন্য আপনাকে ডিবাউন সম্পর্কে জানতে হবে । আপনি যদি গুগল থেকে এখানে এসে থাকেন এবং অ্যান্ডস্কোর আপনার অ্যাপ্লিকেশনটির জাসুপে প্রবেশের সন্ধান পেয়েছে তবে এটি সরাসরি বেকড ডাবনস করেছে !


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;
};

6

আপনার 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

আমি তৈরি করেছি এমন কিছু সাধারণ প্লাগইন রয়েছে যা সুনির্দিষ্টভাবে করে। প্রস্তাবিত সমাধানের তুলনায় এর জন্য অনেক কম কোড দরকার এবং এটি খুব হালকা (, 0,6 কেবি)

প্রথমে আপনি যে 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এটি একরকম করা দরকার । এর সাথে বাম্পিং সংযুক্ত করি keyup event

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

এখানে যা ঘটে তা হ'ল:

প্রতিবার ব্যবহারকারী কী টিপুন, বিডটি পরবর্তী 200 মিমের জন্য 'বিলম্বিত' (বাম্পড) হয়। যদি 200 মিমি আবার 'বম্পড' বিচি ছাড়াই পাস করে তবে কলব্যাক বরখাস্ত করা হবে।

এছাড়াও, আপনার কাছে বিড বন্ধ করার জন্য 2 টি অতিরিক্ত ক্রিয়াকলাপ পাওয়া গেছে (যদি ব্যবহারকারী এসকে চাপ দেয় বা উদাহরণস্বরূপ বাইরের ইনপুটটিকে ক্লিক করে) এবং তত্ক্ষণাত সমাপ্ত এবং কলব্যাক ফায়ারিংয়ের জন্য (উদাহরণস্বরূপ যখন ব্যবহারকারী চাপুন কী চাপুন):

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

1

আমি একটি সাধারণ এইচটিএমএল / জেএস কোড অনুসন্ধান করছি এবং আমি কোনও খুঁজে পেলাম না। তারপরে, আমি ব্যবহার করে নীচের কোডটি লিখেছি 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 প্রসারিত করতে চান এবং একাধিক ইনপুট উপাদানগুলিতে এই পদ্ধতিটি ব্যবহার করতে চান, তবে অনুমোদিত উত্তরটি আপনি যা উত্তর খুঁজছেন তা হ'ল।
ইনকোড


-1

আমার চিন্তাভাবনায় কোনও ব্যবহারকারী যখন লেখাটি বন্ধ করে দেয় সে যখন ইনপুটটিতে ফোকাস না রাখে। এর জন্য আপনার কাছে "অস্পষ্ট" নামক একটি ফাংশন রয়েছে যা স্টাফ পছন্দ করে


4
ভুল! অস্পষ্ট একটি ইভেন্ট যখন ফোকাসটি কোনও নির্দিষ্ট ইনপুট ক্ষেত্রে হারিয়ে যায়। আমার কী প্রয়োজন তা নির্ধারণ করতে হবে যখন কীবোর্ড সেই ক্ষেত্রের অধীনে না থাকে যার ভিত্তিতে আমি একটি ইভেন্ট ট্রিগার করার চেষ্টা করছি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.