জাভাস্ক্রিপ্ট / জিকুয়েরি: $ (উইন্ডো)। আকার পরিবর্তন কিভাবে পুনরায় আকার সম্পন্ন হওয়ার পরে?


235

আমি জিকুয়ারি যেমন ব্যবহার করি:

$(window).resize(function() { ... });

যাইহোক, এটি উপস্থিত হয় যদি সেই ব্যক্তি যদি নিজের ব্রাউজার উইন্ডোটিকে বড় / ছোট করার জন্য উইন্ডোটির প্রান্তটি টেনে এনে ম্যানুয়ালি আকার দেয় তবে .resize উপরের ইভেন্টটি একাধিকবার জ্বলতে থাকে।

প্রশ্ন: ব্রাউজার উইন্ডোটির পুনরায় আকার সম্পন্ন হওয়ার পরে আমি কীভাবে একটি ফাংশন বলতে পারি (যাতে ইভেন্টটি কেবল একবার জ্বলতে থাকে)?


এই উত্তরটি দেখুন: stackoverflow.com/questions/667426/… এতে আপনার কার্যকারিতা কার্যকর করতে বিলম্ব করতে টাইমআউটগুলির ব্যবহার জড়িত।
অ্যালাস্টার পিটস

আমি জানি না যদি এটি সম্ভব হয় তবে আপনি এই প্লাগইনটি চেষ্টা করে দেখতে পারেন যদিও benalman.com/projects/jquery-resize-plugin
BrunoLM

যাইহোক, আমি লক্ষ্য করেছি যে এটি মোবাইল ব্রাউজারগুলিতে খুব দরকারী যা ব্যবহারকারী ধীরে ধীরে অ্যাড্রেস বারটি আড়াল করে user আমি কেবলমাত্র ডেস্কটপে স্ক্রিনের আকার
বদলে যাবার

উত্তর:


299

এখানে সিএমএসের সমাধানের একটি পরিবর্তন রয়েছে যা আপনার কোডে একাধিক জায়গায় কল করা যেতে পারে:

var waitForFinalEvent = (function () {
  var timers = {};
  return function (callback, ms, uniqueId) {
    if (!uniqueId) {
      uniqueId = "Don't call this twice without a uniqueId";
    }
    if (timers[uniqueId]) {
      clearTimeout (timers[uniqueId]);
    }
    timers[uniqueId] = setTimeout(callback, ms);
  };
})();

ব্যবহার:

$(window).resize(function () {
    waitForFinalEvent(function(){
      alert('Resize...');
      //...
    }, 500, "some unique string");
});

সিএমএসের সমাধান ঠিক আছে যদি আপনি কেবল একবার এটি কল করেন তবে আপনি যদি এটি একাধিকবার কল করেন, যেমন আপনার কোডের বিভিন্ন অংশ উইন্ডো আকার পরিবর্তন করতে আলাদা কলব্যাক সেট আপ করে, তবে এটি বি / সি ব্যর্থ হবে এবং তারা timerভেরিয়েবলটি ভাগ করে দেবে ।

এই পরিবর্তনটি দিয়ে আপনি প্রতিটি কলব্যাকের জন্য একটি অনন্য আইডি সরবরাহ করেন এবং সেই সমস্ত অনন্য আইডি সমস্ত সময়সীমা ইভেন্টগুলি আলাদা রাখতে ব্যবহার করা হয়।


2
আমি <3 u, আমি পূর্ণস্ক্রিন (এইচটিএমএল 5 নয়) হাইচার্টের গ্রাফগুলির আকার পরিবর্তন করার সময় এটি একত্রিত করেছি এবং দুর্দান্ত কাজ করে।
মাইকেল জে। ক্যালকিনস

একেবারে অবিশ্বাস্য!
সূচনা

2
যেহেতু আমি আপনার উত্তরটি থেকে অনেক উপকৃত হয়েছি আমি ভেবেছিলাম আমি আপনার সম্প্রদায়ের বাকী অংশের জন্য প্রদত্ত কোডটির একটি কার্যকারী প্রোটোটাইপটি ভাগ করেছি: jsfiddle.net/h6h2pzpu/3 । সবাই উপভোগ করুন!
জোনাস স্টাওস্কি

1
এটি সমস্ত নিখুঁত, তবে এটি মিলিসেকেন্ডের (এমএস) পরিমাণের দ্বারা প্রকৃত ফাংশনটি সম্পাদনকে বিলম্বিত করে, যা খুব অপরিবর্তনীয় হতে পারে।
টমাস এম

এটি কি কেবল নিখুঁতভাবে শেষ উপায়টি ধরার এবং সেই মিলিসেকেন্ডগুলিতে রিলে না থাকার কোনও উপায় আছে? যাইহোক এটি কেবল আমার দিনটি বাঁচিয়েছে: ') ধন্যবাদ।
লিও

138

আমি একটি ইভেন্ট তৈরি করতে পছন্দ করি:

$(window).bind('resizeEnd', function() {
    //do something, window hasn't changed size in 500ms
});

আপনি এটি কীভাবে তৈরি করেছেন তা এখানে:

 $(window).resize(function() {
        if(this.resizeTO) clearTimeout(this.resizeTO);
        this.resizeTO = setTimeout(function() {
            $(this).trigger('resizeEnd');
        }, 500);
    });

আপনি কোথাও একটি বিশ্বব্যাপী জাভাস্ক্রিপ্ট ফাইল এটি থাকতে পারে।


আমি এই সমাধানটি ব্যবহার করেছি। তবে দীর্ঘমেয়াদে আমি ব্রাহ্মণের সমাধানের মতোই বাস্তবায়ন করতে চাই।
ভারত পাতিল

এটি আপনাকে কেবলমাত্র একটি
ফাংশনেই

এটি আমার পক্ষে কাজ করেনি তবে দুসনভি উত্তরটি কাজটি করেছে
হালকা বাইট

123

আমি বারবার ক্রিয়াগুলি বিলম্ব করতে নিম্নলিখিত ফাংশনটি ব্যবহার করি, এটি আপনার ক্ষেত্রে কাজ করবে:

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

ব্যবহার:

$(window).resize(function() {
    delay(function(){
      alert('Resize...');
      //...
    }, 500);
});

কলব্যাক ফাংশনটি এতে প্রেরণ করা হবে, কেবলমাত্র নির্ধারিত সময়ের পরে বিলম্বের শেষ কলটি করা হবে তখনই কার্যকর হবে, অন্যথায় একটি টাইমার পুনরায় সেট করা হবে, যখন ব্যবহারকারী টাইপিং বন্ধ করে দিয়েছে ইত্যাদি সনাক্তকরণের মতো অন্যান্য উদ্দেশ্যে আমি এটি দরকারী মনে করি etc. ..


5
আমি মনে করি একাধিকবার ব্যবহার করা হলে এই পদ্ধতিটি ব্যর্থ হতে পারে (যেমন কোড সেটআপের কল্যাকব্যাকের বিভিন্ন অংশে যদি $(window).resize) তবে তারা সমস্ত timerপরিবর্তনশীল ভাগ করে নেবে । প্রস্তাবিত সমাধানের জন্য নীচে আমার উত্তরটি দেখুন।
ব্রাহ্ন

খুব সুন্দর! একটি যাদুমন্ত্র মত কাজ করে! আপনার উত্তরগুলি পছন্দ করুন ... সহজ এবং মার্জিত!
মিঃ কুমড়ো

74

আপনার যদি অ্যান্ডস্কোর.জেএস ইনস্টল করা থাকে তবে আপনি এটি করতে পারেন:

$(window).resize(_.debounce(function(){
    alert("Resized");
},500));

1
এমনকি যদি আপনি
অ্যান্ডস্কোরটি

আত্মপ্রকাশ এখানে সঠিক কৌশল, এটি বাস্তবায়নের বিষয় মাত্র। অ্যান্ডস্কোর / লোডাশ যদি ইতিমধ্যে কোনও প্রকল্প নির্ভরতা হয় তবে এটি সর্বোত্তম বাস্তবায়ন।
ফ্যাক্টর মিস্টিক

এটিই এখন আমি ব্যবহার করছি,
ভারত পাতিল

20

পূর্বে উল্লিখিত কয়েকটি সমাধান আমার পক্ষে কার্যকর হয়নি, যদিও সেগুলি বেশি সাধারণ ব্যবহারের পরেও। বিকল্পভাবে আমি এইটিকে খুঁজে পেয়েছি যা উইন্ডো পুনরায় আকারে কাজ করেছে:

$(window).bind('resize', function(e){
    window.resizeEvt;
    $(window).resize(function(){
        clearTimeout(window.resizeEvt);
        window.resizeEvt = setTimeout(function(){
        //code to do after window is resized
        }, 250);
    });
});

1
কেবল আপনার উদাহরণটি আমার পক্ষে কাজ করেছিল ... উপরের অন্যরা তা করেনি! আপনার উত্তর কেন নির্বাচন করা হয়নি তা আমি নিশ্চিত নই।
লম্বা জাম্বো

আমি বুঝতে পারছি না কেন পুনরায় আকার দেওয়ার ঘটনা ভিতরে পুনরায় আকার দেওয়ার ঘটনা ধরা, কিন্তু এখনো খুব আমার জন্য কাজ করে ...
lightbyte

মাম্বো জাম্বো, আমি মনে করি কারণ অন্যরা সাধারণীকরণের দিকে মনোনিবেশ করে, এ জাতীয় কোনও সমস্যার সমাধানের জন্য (কোনও ফাংশনের একাধিক কল) সন্ধান করে।
দুসানভি

লাইটবাইট, এটি কারণ কারণ প্রতিবার ফাংশনটি ডাকার সময় আপনাকে পূর্ববর্তী ইভেন্টগুলি থামাতে হবে।
দুশানভি

13

ডেভিড ওয়ালশকে অনেক ধন্যবাদ, এখানে আন্ডারস্কোর ডেবিউনের একটি ভ্যানিলা সংস্করণ।

কোড:

// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

সাধারণ ব্যবহার:

var myEfficientFn = debounce(function() {
    // All the taxing stuff you do
}, 250);

$(window).on('resize', myEfficientFn);

তথ্যসূত্র: http://davidwalsh.name/javascript-debounce-function


6

প্রকৃতপক্ষে, আমি জানি, আকার পরিবর্তন বন্ধ হওয়ার সময় আপনি কিছু ক্রিয়াকলাপ করতে পারবেন না, কেবল কারণ আপনি ভবিষ্যতের ব্যবহারকারীর ক্রিয়াগুলি জানেন না। তবে আপনি দুটি পুনরায় আকারের ইভেন্টের মধ্যে যে সময়টি অতিবাহিত হয়েছে তা ধরে নিতে পারেন, সুতরাং আপনি যদি এই সময়ের চেয়ে কিছুটা বেশি অপেক্ষা করেন এবং কোনও আকার পরিবর্তন না করা হয় তবে আপনি আপনার ফাংশনটিতে কল করতে পারেন।
আইডিয়াটি হ'ল আমরা setTimeoutএটি ব্যবহার করি এবং এটি সংরক্ষণ করতে বা মোছার জন্য এটি আইডি। উদাহরণস্বরূপ আমরা জানি যে দুটি আকার পুনরায় আকারের ইভেন্টের মধ্যে সময় 500 মিমি, সুতরাং আমরা 750ms অপেক্ষা করব।

var a;
$(window).resize(function(){
  clearTimeout(a);
  a = setTimeout(function(){
    // call your function
  },750);
});


3

বিশ্বব্যাপী বিলম্বিত শ্রোতাদের ঘোষণা করুন:

var resize_timeout;

$(window).on('resize orientationchange', function(){
    clearTimeout(resize_timeout);

    resize_timeout = setTimeout(function(){
        $(window).trigger('resized');
    }, 250);
});

এবং নীচে শ্রোতাদের resizedইভেন্ট হিসাবে আপনি চান হিসাবে ব্যবহার করুন :

$(window).on('resized', function(){
    console.log('resized');
});

ধন্যবাদ, এটি বর্তমানে সেরা সমাধান। এছাড়াও আমি পরীক্ষা করেছি যে উইন্ডোটির আকার পরিবর্তন করার সময় 250 মিমি সর্বোত্তম উপায়ে কাজ করছে।
অ্যালেক্সিওয়ে

3

এটা আমার জন্য কাজ করে. এই সমাধানটি দেখুন - https://alvarotrigo.com/blog/firing-resize-event-only-once-when-resizing-is-finised/

var resizeId;
$(window).resize(function() {
    clearTimeout(resizeId);
    resizeId = setTimeout(doneResizing, 500);
});
function doneResizing(){
    //whatever we want to do 
}


2

বিলম্বিত উইন্ডো পুনরায় আকারের ইভেন্টের জন্য সহজ jQuery প্লাগইন।

বাক্য গঠন:

ইভেন্টের আকার পরিবর্তন করতে নতুন ফাংশন যুক্ত করুন

jQuery(window).resizeDelayed( func, delay, id ); // delay and id are optional

পূর্বে যুক্ত ফাংশনটি (এটির আইডি ঘোষণা করে) সরান

jQuery(window).resizeDelayed( false, id );

সমস্ত ফাংশন সরান

jQuery(window).resizeDelayed( false );

ব্যবহার:

// ADD SOME FUNCTIONS TO RESIZE EVENT
jQuery(window).resizeDelayed( function(){ console.log( 'first event - should run after 0.4 seconds'); }, 400,  'id-first-event' );
jQuery(window).resizeDelayed( function(){ console.log('second event - should run after 1.5 seconds'); }, 1500, 'id-second-event' );
jQuery(window).resizeDelayed( function(){ console.log( 'third event - should run after 3.0 seconds'); }, 3000, 'id-third-event' );

// LETS DELETE THE SECOND ONE
jQuery(window).resizeDelayed( false, 'id-second-event' );

// LETS ADD ONE WITH AUTOGENERATED ID(THIS COULDNT BE DELETED LATER) AND DEFAULT TIMEOUT (500ms)
jQuery(window).resizeDelayed( function(){ console.log('newest event - should run after 0.5 second'); } );

// LETS CALL RESIZE EVENT MANUALLY MULTIPLE TIMES (OR YOU CAN RESIZE YOUR BROWSER WINDOW) TO SEE WHAT WILL HAPPEN
jQuery(window).resize().resize().resize().resize().resize().resize().resize();

ব্যবহার আউটপুট:

first event - should run after 0.4 seconds
newest event - should run after 0.5 second
third event - should run after 3.0 seconds

প্লাগ লাগানো:

jQuery.fn.resizeDelayed = (function(){

    // >>> THIS PART RUNS ONLY ONCE - RIGHT NOW

    var rd_funcs = [], rd_counter = 1, foreachResizeFunction = function( func ){ for( var index in rd_funcs ) { func(index); } };

    // REGISTER JQUERY RESIZE EVENT HANDLER
    jQuery(window).resize(function() {

        // SET/RESET TIMEOUT ON EACH REGISTERED FUNCTION
        foreachResizeFunction(function(index){

            // IF THIS FUNCTION IS MANUALLY DISABLED ( by calling jQuery(window).resizeDelayed(false, 'id') ),
            // THEN JUST CONTINUE TO NEXT ONE
            if( rd_funcs[index] === false )
                return; // CONTINUE;

            // IF setTimeout IS ALREADY SET, THAT MEANS THAT WE SHOULD RESET IT BECAUSE ITS CALLED BEFORE DURATION TIME EXPIRES
            if( rd_funcs[index].timeout !== false )
                clearTimeout( rd_funcs[index].timeout );

            // SET NEW TIMEOUT BY RESPECTING DURATION TIME
            rd_funcs[index].timeout = setTimeout( rd_funcs[index].func, rd_funcs[index].delay );

        });

    });

    // <<< THIS PART RUNS ONLY ONCE - RIGHT NOW

    // RETURN THE FUNCTION WHICH JQUERY SHOULD USE WHEN jQuery(window).resizeDelayed(...) IS CALLED
    return function( func_or_false, delay_or_id, id ){

        // FIRST PARAM SHOULD BE SET!
        if( typeof func_or_false == "undefined" ){

            console.log( 'jQuery(window).resizeDelayed(...) REQUIRES AT LEAST 1 PARAMETER!' );
            return this; // RETURN JQUERY OBJECT

        }

        // SHOULD WE DELETE THE EXISTING FUNCTION(S) INSTEAD OF CREATING A NEW ONE?
        if( func_or_false == false ){

            // DELETE ALL REGISTERED FUNCTIONS?
            if( typeof delay_or_id == "undefined" ){

                // CLEAR ALL setTimeout's FIRST
                foreachResizeFunction(function(index){

                    if( typeof rd_funcs[index] != "undefined" && rd_funcs[index].timeout !== false )
                        clearTimeout( rd_funcs[index].timeout );

                });

                rd_funcs = [];

                return this; // RETURN JQUERY OBJECT

            }
            // DELETE ONLY THE FUNCTION WITH SPECIFIC ID?
            else if( typeof rd_funcs[delay_or_id] != "undefined" ){

                // CLEAR setTimeout FIRST
                if( rd_funcs[delay_or_id].timeout !== false )
                    clearTimeout( rd_funcs[delay_or_id].timeout );

                rd_funcs[delay_or_id] = false;

                return this; // RETURN JQUERY OBJECT

            }

        }

        // NOW, FIRST PARAM MUST BE THE FUNCTION
        if( typeof func_or_false != "function" )
            return this; // RETURN JQUERY OBJECT

        // SET THE DEFAULT DELAY TIME IF ITS NOT ALREADY SET
        if( typeof delay_or_id == "undefined" || isNaN(delay_or_id) )
            delay_or_id = 500;

        // SET THE DEFAULT ID IF ITS NOT ALREADY SET
        if( typeof id == "undefined" )
            id = rd_counter;

        // ADD NEW FUNCTION TO RESIZE EVENT
        rd_funcs[id] = {
            func : func_or_false,
            delay: delay_or_id,
            timeout : false
        };

        rd_counter++;

        return this; // RETURN JQUERY OBJECT

    }

})();

1

ধরে নিলাম যে মাউস কার্সারটি উইন্ডো পুনরায় আকার দেওয়ার পরে দস্তাবেজের কাছে ফিরে আসবে, আমরা অন-মাউসওভার ইভেন্টের সাথে একটি কলব্যাকের মতো আচরণ তৈরি করতে পারি। ভুলে যাবেন না যে এই সমাধানটি স্পর্শ-সক্ষম স্ক্রিনগুলির প্রত্যাশার মতো কাজ করতে পারে না।

var resizeTimer;
var resized = false;
$(window).resize(function() {
   clearTimeout(resizeTimer);
   resizeTimer = setTimeout(function() {
       if(!resized) {
           resized = true;
           $(document).mouseover(function() {
               resized = false;
               // do something here
               $(this).unbind("mouseover");
           })
       }
    }, 500);
});

মাউস-ভিত্তিক ডেস্কটপ-কেবলমাত্র সাইটের জন্য দুর্দান্ত তবে মাউসওভার ইভেন্টটি কখনই ঘটবে না, উদাহরণস্বরূপ, ব্যবহারকারী যদি কোনও মোবাইলে থাকে এবং ল্যান্ডস্কেপ থেকে প্রতিকৃতিতে পরিবর্তিত হয়, বা যদি তারা টাচস্ক্রিন ডেস্কটপে উইন্ডোটিকে পুনরায় আকার দেয়।
user56reinstatemonica8

উইন-অ্যারো-বাম উইন-অ্যারো-রাইট ইত্যাদির মতো সর্বশেষ উইন্ডোজ ওসে কীবোর্ডের সাহায্যে আপনি ব্রাউজার উইন্ডোটির আকার পরিবর্তন করতে পারেন ...
Lu4

0

এটিই আমি প্রয়োগ করেছি:

window (উইন্ডো) .resize (ফাংশন () {সেটটাইমআউট (কিছু ফাংশন, 500);});

আমরা যদি পুনরায় আকারের চেয়ে কম হওয়ার আশা করি তবে আমরা সেটটাইমআউটটি সাফ করতে পারি500ms

শুভকামনা ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.