জাভাস্ক্রিপ্ট: সমস্ত টাইমআউট সাফ করবেন?


104

প্রদত্ত উইন্ডো থেকে অলটাইম আউট সাফ করার কোনও উপায় আছে কি? আমি মনে করি সময়সীমা windowবস্তুর কোথাও সঞ্চিত আছে তবে এটি নিশ্চিত করতে পারছে না।

যে কোনও ক্রস ব্রাউজার সমাধান স্বাগত।



6
বাবু, এই প্রশ্নটি 3 বছর আগের এবং এর দুর্দান্ত উত্তর রয়েছে। এটি নিয়ে গণ্ডগোল করার দরকার নেই।
marcio

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

4
@ বার্নার্ড হাফম্যান আমি নিশ্চিত নই যে এটির যদি আরও ভাল উত্তর পাওয়া যায় তবে এটি একটি সদৃশ প্রশ্ন হিসাবে গণ্য হবে। ২০১০ সাল থেকে এটির উপর গৃহীত উত্তরটি ছিল "না"।
রোবোটিক রেনেসাঁ

উত্তর:


151

এগুলি উইন্ডো অবজেক্টে নেই, তবে তাদের আইডিস রয়েছে, যা (আফাইক) একটানা পূর্ণসংখ্যা হয়।

সুতরাং আপনি সমস্ত টাইমআউটগুলি এর মতো সাফ করতে পারেন:

var id = window.setTimeout(function() {}, 0);

while (id--) {
    window.clearTimeout(id); // will do nothing if no timeout with id is present
}

4
এই নির্দিষ্টকরণের অংশ, বা এটি বাস্তবায়ন-নির্ভর হতে পারে?
টিখন জেলভিস 14'12

7
এটি ১ থেকে শুরু করার দরকার নেই এইচটিএমএল 5 অনুচ্ছেদে বলা হয়েছে "হ্যান্ডেলটি এমন কোনও ব্যবহারকারী-এজেন্ট-সংজ্ঞায়িত পূর্ণসংখ্যা হয়ে উঠুক যা শূন্যের চেয়ে বড় যা এই কল দ্বারা নির্ধারিত সময়সীমার সনাক্ত করবে" " যা হ্যান্ডেলটি অবিচ্ছিন্ন এবং অ-ছোট ছোট পূর্ণসংখ্যাসহ কোনও ধনাত্মক পূর্ণ সংখ্যার জন্য জায়গা ছেড়ে দেয়।
মাইক স্যামুয়েল

4
এটি খুব চতুর, তবে ওপিকে সম্ভবত জিজ্ঞাসা করা উচিত যে আরও কার্যকর কোনও সমাধান রয়েছে যা সক্রিয় টাইমারদের নজর রাখে।
জেসন হারুইগ

4
এটি কি অসীম লুপ নয়? সমস্ত ব্রাউজারগুলি (0) কে মিথ্যা হিসাবে রেন্ডার করে না।
ট্র্যাভিস জে

4
যেহেতু আমি কীভাবে সমস্ত টাইমআউটগুলি সাফ করবেন জিজ্ঞাসা করেছি, তাই আমি এই উত্তরটি গ্রহণ করছি। খুব চতুর সমাধান।
মারসিও

80

আমি মনে করি এটি সম্পাদন করার সবচেয়ে সহজ উপায় হ'ল সমস্ত setTimeoutশনাক্তকারীকে এক অ্যারেতে সংরক্ষণ করা, যেখানে আপনি সহজেই সেগুলির সমস্তটিতে পুনরাবৃত্তি করতে পারেন clearTimeout()

var timeouts = [];
timeouts.push(setTimeout(function(){alert(1);}, 200));
timeouts.push(setTimeout(function(){alert(2);}, 300));
timeouts.push(setTimeout(function(){alert(3);}, 400));

for (var i=0; i<timeouts.length; i++) {
  clearTimeout(timeouts[i]);
}

14
এতে আপনার সেট করা ক্লিয়ারিংয়ের বোনাস (বা সম্ভাব্য অপূর্ণতা, আমার ধারণা) রয়েছে , যাতে আপনি অজান্তেই বাহিরের কোডটি ভাঙবেন না।
টিখন জেলভিস

4
+1, সমস্ত টাইমআউটগুলি সাফ করবে না তবে একবারে নির্দিষ্ট গ্রুপের
টাইমআউটগুলি

4
এটি সর্বোত্তম সমাধান কারণ এটি বাহ্যিক কোড ভাঙবে না, তবে যেহেতু আমি কীভাবে সমস্ত সময়সীমা সাফ করবেন জিজ্ঞাসা করে আমি @ পুম্বা ৮০ উত্তরটি গ্রহণ করে শেষ করেছি :)
মার্সিও

4
@মারসিওআলমদা স্ট্রেঞ্জ, তবে আপনি 2.5 বছর পরে আবার এ সম্পর্কে মন্তব্য করতে ফিরে দেখে খুব শীঘ্রই :)
মাইকেল বার্কোভস্কি

6
আমি নিয়ন্ত্রণ করতে পারি না এমন কোনও ওয়েবপৃষ্ঠায় প্রবেশ করার সময় আমি সমস্ত সময়সীমা এবং ব্যবধানগুলি সাফ করতে চাই কারণ তাদের অ্যাডব্লায়ার চালানোর পরে শুরু হয় না এমন বিরক্তিকর পপআপ বিজ্ঞাপন রয়েছে।
রোবোটিক রেনেসাঁ

12

পুম্বা 80 এর উত্তরে আমার একটি সংযোজন রয়েছে হতে পারে।

হ্যাঁ, সমস্ত বড় ব্রাউজারগুলি একটানা পূর্ণসংখ্যা হিসাবে টাইমআউট আইডি প্রয়োগ করে (যা নির্দিষ্টকরণের দ্বারা প্রয়োজন হয় না )। আরম্ভের নম্বরটি ব্রাউজার থেকে ফর্ম ব্রাউজারের থেকে পৃথক হয়। দেখে মনে হচ্ছে যে অপেরা, সাফারি, ক্রোম এবং আই> 8 টি 1 থেকে টাইমআউট আইডি শুরু করে, 2 থেকে গেকো-ভিত্তিক ব্রাউজারগুলি এবং আইই <= 8 এমন কিছু এলোমেলো সংখ্যা থেকে যা ম্যাজিকভাবে ট্যাব রিফ্রেশ জুড়ে সংরক্ষণ করা হয়। আপনি নিজে এটি আবিষ্কার করতে পারেন

IE <= 8-এ while (lastTimeoutId--)চক্রটি 8 ডিজিটেরও বেশি সময় চলতে পারে এবং " এই পৃষ্ঠার একটি স্ক্রিপ্ট ইন্টারনেট এক্সপ্লোরারকে আস্তে আস্তে চালিত করছে " বার্তাটি দেখায় All সুতরাং আপনি যদি সমস্ত টাইমআউট আইডির সমস্ত সংরক্ষণ করতে না পারেন বা উইন্ডোকে ওভাররাইড করতে চান না set সেটটাইমআউট আপনি কোনও পৃষ্ঠায় প্রথম টাইমআউট আইডি সংরক্ষণ এবং এটি অবধি টাইমআউটগুলি সাফ করার বিষয়ে বিবেচনা করতে পারেন।

প্রাথমিক পৃষ্ঠা লোডে কোডটি কার্যকর করুন:

var clearAllTimeouts = (function () {
    var noop = function () {},
        firstId = window.setTimeout(noop, 0);
    return function () {
        var lastId = window.setTimeout(noop, 0);
        console.log('Removing', lastId - firstId, 'timeout handlers');
        while (firstId != lastId)
            window.clearTimeout(++firstId);
    };
});

এবং তারপরে সমস্ত মুলতুবি থাকা সময়সীমাগুলি সাফ করুন যা সম্ভবত আপনি চান বহুবার বিদেশী কোড দ্বারা সেট করা হয়েছিল


আরও কিছু বিশদ তথ্য স্পষ্ট করার জন্য এক।
সঞ্জয়

8

কীভাবে বিশ্বব্যাপী অ্যারেতে টাইমআউট আইডিগুলি সংরক্ষণ করা যায় এবং উইন্ডোতে ফাংশন কলটি অর্পণ করার জন্য একটি পদ্ধতি নির্ধারণ করা হয়।

GLOBAL={
    timeouts : [],//global timeout id arrays
    setTimeout : function(code,number){
        this.timeouts.push(setTimeout(code,number));
    },
    clearAllTimeout :function(){
        for (var i=0; i<this.timeouts.length; i++) {
            window.clearTimeout(this.timeouts[i]); // clear all the timeouts
        }
        this.timeouts= [];//empty the id array
    }
};

4

আপনাকে window.setTimeoutপদ্ধতিটি পুনরায় লিখতে হবে এবং এর সময়সীমা আইডি সংরক্ষণ করতে হবে।

const timeouts = [];
const originalTimeoutFn = window.setTimeout;

window.setTimeout = function(fun, delay) { //this is over-writing the original method
  const t = originalTimeoutFn(fn, delay);
  timeouts.push(t);
}

function clearTimeouts(){
  while(timeouts.length){
    clearTimeout(timeouts.pop();
  }
}

3

সমস্ত সময়সীমা সাফ করার জন্য তাদের অবশ্যই প্রথমে "ক্যাপচার" করা উচিত :

অন্য কোনও স্ক্রিপ্টের আগে নীচের কোডটি রাখুন এবং এটি মূল setTimeout& এর জন্য একটি মোড়ক ফাংশন তৈরি করবে clearTimeout

অবজেক্টে একটি নতুন clearTimeoutsপদ্ধতি যুক্ত করা windowহবে, যা সমস্ত (মুলতুবি) সময়সীমা ( গিস্ট লিঙ্ক ) সাফ করার অনুমতি দেবে ।

অন্যান্য উত্তরগুলির মধ্যে সম্ভাব্য যুক্তিগুলি পেতে পারে এমন সম্পূর্ণ সমর্থনটির অভাব রয়েছে । setTimeout

// isolated layer wrapper (for the local variables)
(function(_W){

var cache = [],                // will store all timeouts IDs
    _set = _W.setTimeout,      // save original reference
    _clear = _W.clearTimeout  // save original reference

// Wrap original setTimeout with a function 
_W.setTimeout = function( CB, duration, arg ){
    // also, wrap the callback, so the cache reference will be removed 
    // when the timeout has reached (fired the callback)
    var id = _set(function(){
        CB.apply(null, arguments)
        removeCacheItem(id)
    }, duration || 0, arg)

    cache.push( id ) // store reference in the cache array

    // id reference must be returned to be able to clear it 
    return id
}

// Wrap original clearTimeout with a function 
_W.clearTimeout = function( id ){
    _clear(id)
    removeCacheItem(id)
}

// Add a custom function named "clearTimeouts" to the "window" object
_W.clearTimeouts = function(){
    console.log("Clearing " + cache.length + " timeouts")
    cache.forEach(n => _clear(n))
    cache.length = []
}

// removes a specific id from the cache array 
function removeCacheItem( id ){
    var idx = cache.indexOf(id)

    if( idx > -1 )
        cache = cache.filter(n => n != id )
}

})(window);


2

সম্পূর্ণতার জন্য, আমি একটি সাধারণ সমাধান পোস্ট করতে চেয়েছিলাম যা উভয়ই setTimeoutএবং কভার করে setInterval

দেখে মনে হচ্ছে ব্রাউজারগুলি উভয়ের জন্যই আইডির একই পুল ব্যবহার করতে পারে তবে কিছু উত্তর থেকে ক্লিয়ারটাইমআউট এবং ক্লিয়ারইন্টারভাল একই? , এটি নির্ভর করে যে এটি নির্ভর করে clearTimeoutএবং তা নিরাপদ কিনা notclearInterval একই ফাংশন সম্পাদন করা বা কেবল তাদের নিজ নিজ টাইমার ধরণের ক্ষেত্রে কাজ করা ।

অতএব, যখন লক্ষ্যটি সমস্ত সময়সীমা এবং অন্তরগুলিকে হত্যা করা হয়, এখানে এমন একটি বাস্তবায়ন রয়েছে যা সমস্তগুলি পরীক্ষা করতে অক্ষম হলে বাস্তবায়নগুলি জুড়ে কিছুটা রক্ষণাত্মক হতে পারে:

function clearAll(windowObject) {
  var id = Math.max(
    windowObject.setInterval(noop, 1000),
    windowObject.setTimeout(noop, 1000)
  );

  while (id--) {
    windowObject.clearTimeout(id);
    windowObject.clearInterval(id);
  }

  function noop(){}
}

আপনি এটি বর্তমান উইন্ডোতে সমস্ত টাইমার সাফ করতে ব্যবহার করতে পারেন:

clearAll(window);

অথবা আপনি এটিতে সমস্ত টাইমার সাফ করার জন্য এটি ব্যবহার করতে পারেন iframe:

clearAll(document.querySelector("iframe").contentWindow);

মনে রাখবেন যে এই পদ্ধতিটি ভ্যু-ক্লিপ-পরিষেবা পর্যবেক্ষককে ধ্বংস করে দেয় যাতে আপনি সমস্ত সময়সীমার এবং সময়সীমা পরিষ্কার করার সময় হট-পুনরায় লোড করতে পারবেন না। আমি ধরে নিলাম ফ্রেমওয়ার্কগুলির জন্য অন্যান্য হট রিলোডলোড পর্যবেক্ষকদের জন্য এটি একই রকম (কৌণিক, প্রতিক্রিয়া, এমবার ইত্যাদি)
মিশেল মাইখাইলিডিস

1

আমি টাইপস্ক্রিপ্ট সহ ভ্যু ব্যবহার করি।

    private setTimeoutN;
    private setTimeoutS = [];

    public myTimeoutStart() {

        this.myTimeoutStop();//stop All my timeouts

        this.setTimeoutN = window.setTimeout( () => {
            console.log('setTimeout');
        }, 2000);

        this.setTimeoutS.push(this.setTimeoutN)//add THIS timeout ID in array

    }

    public myTimeoutStop() {

        if( this.setTimeoutS.length > 0 ) {
            for (let id in this.setTimeoutS) {
                console.log(this.setTimeoutS[id]);
                clearTimeout(this.setTimeoutS[id]);
            }
            this.setTimeoutS = [];//clear IDs array
        }
    }

1

এটা খুব দেরী ... কিন্তু:

মূলত, সেটটাইমআউট / সেটইন্টারওয়াল আইডি একটানা ক্রমে চলে যায়, সুতরাং সর্বাধিক আইডি পেতে কেবল একটি ডামি টাইমআউট ফাংশন তৈরি করুন, তারপরে তার চেয়ে কম আইডিগুলিতে পরিষ্কার করুন।

const highestId = window.setTimeout(() => {
  for (let i = highestId; i >= 0; i--) {
    window.clearInterval(i);
  }
}, 0);

এটি আমার জন্য সেরা সমাধান ছিল !! ধন্যবাদ চারি
লোকস

0

আপনার অন্যান্য সমস্ত ফাংশনগুলির সময় থেকে প্রাপ্ত যা একটি বিশ্বব্যাপী সময়সীমা ব্যবহার করুন। এটি সবকিছু দ্রুত চালিত করবে এবং পরিচালনা করা সহজ করবে যদিও এটি আপনার কোডটিতে কিছু বিমূর্ততা যুক্ত করবে।


আমি আপনাকে পুরোপুরি বুঝতে পারি না। আপনি set_timeoutগ্লোবাল ফাংশন আচরণ প্রসারিত মানে ? আপনি একটি উদাহরণ কোড দিতে পারেন?
মার্সিও

4
আমি কেবল বোঝাতে চেয়েছিলাম যে আপনার প্রতি 50 মিটারে একবারে একটি গ্লোবাল টাইমআউট চলছে। সময়সীমার উপাদানগুলির প্রয়োজন হয় এমন অন্যান্য প্রতিটি ক্রিয়াকলাপটি তখন এটির গ্লোবাল টাইমআউট থেকে দখল করবে। গুগল দক্ষতার জন্য এটিতে স্যুইচ করেছে, যদিও নিবন্ধটি উদ্ধৃত করে আর খুঁজে পাচ্ছি না।
ট্র্যাভিস জে

0

আমরা ঠিক এই সমস্যাটি সমাধান করার জন্য একটি প্যাকেজ প্রকাশ করেছি।

npm install time-events-manager

এটির সাথে, আপনি timeoutCollection& intervalCollectionঅবজেক্টগুলির মাধ্যমে সমস্ত সময়সীমা এবং অন্তর দেখতে পারেন । এখানে একটি removeAllফাংশন রয়েছে যা সংগ্রহ এবং ব্রাউজার উভয় থেকে সমস্ত সময়সীমা / অন্তর সাফ করে।

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