প্রদত্ত উইন্ডো থেকে অলটাইম আউট সাফ করার কোনও উপায় আছে কি? আমি মনে করি সময়সীমা window
বস্তুর কোথাও সঞ্চিত আছে তবে এটি নিশ্চিত করতে পারছে না।
যে কোনও ক্রস ব্রাউজার সমাধান স্বাগত।
প্রদত্ত উইন্ডো থেকে অলটাইম আউট সাফ করার কোনও উপায় আছে কি? আমি মনে করি সময়সীমা window
বস্তুর কোথাও সঞ্চিত আছে তবে এটি নিশ্চিত করতে পারছে না।
যে কোনও ক্রস ব্রাউজার সমাধান স্বাগত।
উত্তর:
এগুলি উইন্ডো অবজেক্টে নেই, তবে তাদের আইডিস রয়েছে, যা (আফাইক) একটানা পূর্ণসংখ্যা হয়।
সুতরাং আপনি সমস্ত টাইমআউটগুলি এর মতো সাফ করতে পারেন:
var id = window.setTimeout(function() {}, 0);
while (id--) {
window.clearTimeout(id); // will do nothing if no timeout with id is present
}
আমি মনে করি এটি সম্পাদন করার সবচেয়ে সহজ উপায় হ'ল সমস্ত 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]);
}
পুম্বা 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);
};
});
এবং তারপরে সমস্ত মুলতুবি থাকা সময়সীমাগুলি সাফ করুন যা সম্ভবত আপনি চান বহুবার বিদেশী কোড দ্বারা সেট করা হয়েছিল
কীভাবে বিশ্বব্যাপী অ্যারেতে টাইমআউট আইডিগুলি সংরক্ষণ করা যায় এবং উইন্ডোতে ফাংশন কলটি অর্পণ করার জন্য একটি পদ্ধতি নির্ধারণ করা হয়।
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
}
};
আপনাকে 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();
}
}
অন্য কোনও স্ক্রিপ্টের আগে নীচের কোডটি রাখুন এবং এটি মূল 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);
সম্পূর্ণতার জন্য, আমি একটি সাধারণ সমাধান পোস্ট করতে চেয়েছিলাম যা উভয়ই 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);
আমি টাইপস্ক্রিপ্ট সহ ভ্যু ব্যবহার করি।
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
}
}
এটা খুব দেরী ... কিন্তু:
মূলত, সেটটাইমআউট / সেটইন্টারওয়াল আইডি একটানা ক্রমে চলে যায়, সুতরাং সর্বাধিক আইডি পেতে কেবল একটি ডামি টাইমআউট ফাংশন তৈরি করুন, তারপরে তার চেয়ে কম আইডিগুলিতে পরিষ্কার করুন।
const highestId = window.setTimeout(() => {
for (let i = highestId; i >= 0; i--) {
window.clearInterval(i);
}
}, 0);
আপনার অন্যান্য সমস্ত ফাংশনগুলির সময় থেকে প্রাপ্ত যা একটি বিশ্বব্যাপী সময়সীমা ব্যবহার করুন। এটি সবকিছু দ্রুত চালিত করবে এবং পরিচালনা করা সহজ করবে যদিও এটি আপনার কোডটিতে কিছু বিমূর্ততা যুক্ত করবে।
set_timeout
গ্লোবাল ফাংশন আচরণ প্রসারিত মানে ? আপনি একটি উদাহরণ কোড দিতে পারেন?
আমরা ঠিক এই সমস্যাটি সমাধান করার জন্য একটি প্যাকেজ প্রকাশ করেছি।
npm install time-events-manager
এটির সাথে, আপনি timeoutCollection
& intervalCollection
অবজেক্টগুলির মাধ্যমে সমস্ত সময়সীমা এবং অন্তর দেখতে পারেন । এখানে একটি removeAll
ফাংশন রয়েছে যা সংগ্রহ এবং ব্রাউজার উভয় থেকে সমস্ত সময়সীমা / অন্তর সাফ করে।