जावास्क्रिप्ट में बंद करो


1398

मैं setInterval(fname, 10000);जावास्क्रिप्ट में हर 10 सेकंड में एक फ़ंक्शन को कॉल करने के लिए उपयोग कर रहा हूं । क्या किसी घटना पर इसे रोकना संभव है?

मैं चाहता हूं कि उपयोगकर्ता डेटा के बार-बार ताज़ा होने से रोकने में सक्षम हो।

जवाबों:


2160

setInterval()एक अंतराल आईडी देता है, जिसे आप पास कर सकते हैं clearInterval():

var refreshIntervalId = setInterval(fname, 10000);

/* later */
clearInterval(refreshIntervalId);

के लिये दस्तावेज देखें setInterval()और clearInterval()


42
'ClearInterval ()' के साथ रुकने के बाद आप इसे फिर से कैसे शुरू कर सकते हैं? अगर मैं इसे पुनः आरंभ करने की कोशिश करता हूं तो मुझे 2x सेटइंटरवल चल रहा है।
डैन

8
मुझे भी हर बार कि मैं SetInterval (MyFunction, 4000) का उपयोग करना चाहते हैं; यह तेजी से और तेजी से मिलता है, हर बार 2x समय तेजी से :( मैं एक सेटटर्नल को कैसे पुनः आरंभ कर सकता हूं?
Alireza Masali

14
सेटइंटरवल () उस गति को नहीं बदलता है जिसे आप इसे पास करते हैं। यदि जो कुछ भी वह हर बार गति कर रहा है जिसे आप सेटइंटरवल () कहते हैं, तो आपके पास कई टाइमर हैं जो एक ही समय में चल रहे हैं, और एक नया प्रश्न खोलना चाहिए।
एपिकवॉयज

29
सुनिश्चित करें कि आप वास्तव में इसे रोक रहे हैं। वेरिएबल स्कूपिंग के कारण, आपके पास कॉल करने के लिए सही आईडी नहीं हो सकती है clearInterval। मैंने window.refreshIntervalIdएक स्थानीय चर के बजाय उपयोग किया है , और यह बहुत अच्छा काम करता है!
osa

2
मैंने अपने संबंधित तत्व (जब प्रासंगिक) के लिए सेटइंटरवल हैंडल संलग्न करना शुरू कर दिया है: $('foo').data('interval', setInterval(fn, 100));और फिर इसे साफ़ करने के साथ clearInterval($('foo').data('interval'));मुझे यकीन है कि ऐसा करने के लिए एक गैर-jQuery तरीका है, भी।
माइकल - कहाँ का क्ले शिर्क

105

यदि आप setIntervalकिसी चर का रिटर्न मान सेट करते हैं , तो आप clearIntervalइसे रोकने के लिए उपयोग कर सकते हैं ।

var myTimer = setInterval(...);
clearInterval(myTimer);

मुझे इस और जॉन के जवाब के बीच का अंतर नहीं दिखता
बोबट्रोपो

51

आप एक नया चर सेट कर सकते हैं और इसे ++ (हर एक को गिनें) के हिसाब से बढ़ा सकते हैं, फिर मैं इसे समाप्त करने के लिए एक सशर्त विवरण का उपयोग करता हूं:

var intervalId = null;
var varCounter = 0;
var varName = function(){
     if(varCounter <= 10) {
          varCounter++;
          /* your code goes here */
     } else {
          clearInterval(intervalId);
     }
};

$(document).ready(function(){
     intervalId = setInterval(varName, 10000);
});

मुझे उम्मीद है कि यह मदद करता है और यह सही है।


3
मुझे यह जानकर आश्चर्य हुआ कि यह काम करता है clearInterval(varName);। मुझे उम्मीद clearIntervalहै कि जब फ़ंक्शन नाम पारित हुआ तो मैं काम नहीं करूंगा, मुझे लगा कि इसे अंतराल आईडी की आवश्यकता है। मुझे लगता है कि यह केवल तभी काम कर सकता है जब आपके पास एक नामित फ़ंक्शन हो, क्योंकि आप एक अनाम फ़ंक्शन को स्वयं के अंदर एक चर के रूप में पारित नहीं कर सकते हैं।
पैट्रिक एम

31
वास्तव में मुझे लगता है कि यह काम नहीं करता है। काउंटर पर प्रतिबंध के कारण कोड बंद किया जा रहा है, लेकिन अंतराल varName फायरिंग करता रहता है ()। ClearInterval () (अन्य क्लॉज़ के अंदर) के बाद कुछ भी लॉग इन करने की कोशिश करें और आप देखेंगे कि यह हमेशा के लिए लिखा जा रहा है।
राफेल ओलिवेरा

5
बहुत से कुछ काम नहीं करता है के लिए कई upvotes, कभी-कभी मैं SO पर लोगों को समझ में नहीं आता है: P
फंसे बच्चे

2
$(document).ready(function(){ });jQuery है, इसीलिए यह काम नहीं करता है। इसका उल्लेख कम से कम किया जाना चाहिए।
15

4
@OMGrant, एक उदाहरण के अलावा जो काम नहीं करता है, आपके पास नाम का एक चर है varName, जो एक अनाम फ़ंक्शन को स्टोर करता है - wha ?? आपको इस जवाब को, IMHO को बदलना या नीचे ले जाना चाहिए।
डीन रैडक्लिफ

13

ऊपर दिए गए उत्तर पहले ही बता चुके हैं कि कैसे सेटइंटरवाल एक हैंडल देता है, और कैसे इस हैंडल का उपयोग इंटरवल टाइमर को रद्द करने के लिए किया जाता है।

कुछ वास्तु विचार:

कृपया "गुंजाइश-कम" चर का उपयोग न करें। सबसे सुरक्षित तरीका एक DOM ऑब्जेक्ट की विशेषता का उपयोग करना है। सबसे आसान स्थान "दस्तावेज़" होगा। यदि रिफ्रेशर स्टार्ट / स्टॉप बटन द्वारा शुरू किया जाता है, तो आप स्वयं बटन का उपयोग कर सकते हैं:

<a onclick="start(this);">Start</a>

<script>
function start(d){
    if (d.interval){
        clearInterval(d.interval);
        d.innerHTML='Start';
    } else {
        d.interval=setInterval(function(){
          //refresh here
        },10000);
        d.innerHTML='Stop';
    }
}
</script>

चूंकि फ़ंक्शन बटन क्लिक हैंडलर के अंदर परिभाषित है, इसलिए आपको इसे फिर से परिभाषित करने की आवश्यकता नहीं है। बटन को फिर से क्लिक करने पर टाइमर को फिर से शुरू किया जा सकता है।


1
क्या पर डालने के बारे में बेहतर है documentपर की तुलना में window?
icktoofay

1
भूल सुधार। मेरा कहने का मतलब था डॉक्युमेंट। अपने कोड उदाहरण में मैं प्रभावी रूप से बटन का उपयोग कर रहा हूं। बटन के लिए कोई आईडी नहीं है, लेकिन "यह" सूचक फ़ंक्शन में "डी" पैरामीटर से बंधा है। कार्यक्षेत्र के रूप में "विंडो" का उपयोग करना जोखिम भरा है क्योंकि फ़ंक्शन भी हैं। उदाहरण के लिए, "फ़ंक्शन टेस्ट () {}" window.test के माध्यम से सुलभ है, जो एक गुंजाइश का उपयोग नहीं करने के समान है, क्योंकि यह एक शॉर्टहैंड है। उम्मीद है की यह मदद करेगा।
शियन

1
"स्कोप-लेस" वैरिएबल न खोएं -> "स्कोप-कम" का उपयोग न करें "मैंने इसे संपादित किया होगा, लेकिन परिवर्तन 6 अक्षर से कम है, और त्रुटि भ्रामक है।
लेईफ नेलैंड

2
उसके लिए आपको DOM की आवश्यकता नहीं है। वैश्विक दायरे के प्रदूषण से बचने के लिए बस हमें एक IIFE।
ओनुर येल्ड्रिम्म

1
मुझे फिर से काम करने के लिए इनरशीन = 'स्टार्ट' के बाद 'd.interval = अनिर्धारित' जोड़ना होगा। क्योंकि उस तरह सिर्फ एक समय काम करता है।
jocmtb

11

पहले से ही उत्तर दिया गया है ... लेकिन अगर आपको एक विशेष, फिर से उपयोग करने योग्य टाइमर की आवश्यकता है जो विभिन्न अंतरालों पर कई कार्यों का समर्थन करता है, तो आप मेरे टास्कटीमर (नोड और ब्राउज़र के लिए) का उपयोग कर सकते हैं ।

// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);

// Add task(s) based on tick intervals.
timer.add({
    id: 'job1',         // unique id of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (omit for unlimited times)
    callback(task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
        // stop the timer anytime you like
        if (someCondition()) timer.stop();
        // or simply remove this task if you have others
        if (someCondition()) timer.remove(task.id);
    }
});

// Start the timer
timer.start();

आपके मामले में, जब उपयोगकर्ता डेटा-ताज़ा करने के लिए परेशान करते हैं; आप timer.pause()तब भी कॉल कर सकते हैं, timer.resume()यदि उन्हें पुनः सक्षम करने की आवश्यकता हो।

देखें और अधिक यहाँ


6

ClearInterval () विधि का उपयोग setInterval () विधि के साथ टाइमर सेट को साफ़ करने के लिए किया जा सकता है।

setInterval हमेशा एक ID मान लौटाता है। टाइमर को रोकने के लिए यह मान ClearInterval () में पारित किया जा सकता है। यहां टाइमर का एक उदाहरण 30 से शुरू होता है और 0 हो जाने पर रुक जाता है।

  let time = 30;
  const timeValue = setInterval((interval) => {
  time = this.time - 1;
  if (time <= 0) {
    clearInterval(timeValue);
  }
}, 1000);

5

@cnu,

जब आप उर कंसोल ब्राउज़र (F12) देखने से पहले रन कोड की कोशिश करते हैं, तो आप अंतराल को रोक सकते हैं ... टिप्पणी साफ़ करने की कोशिश करें (ट्रिगर) फिर से एक कंसोल दिख रहा है, ब्यूटिफायर नहीं? : पी

उदाहरण का स्रोत देखें:

var trigger = setInterval(function() { 
  if (document.getElementById('sandroalvares') != null) {
    document.write('<div id="sandroalvares" style="background: yellow; width:200px;">SandroAlvares</div>');
    clearInterval(trigger);
    console.log('Success');
  } else {
    console.log('Trigger!!');
  }
}, 1000);
<div id="sandroalvares" style="background: gold; width:200px;">Author</div>


3

वैरिएबल वैरिएबल को असाइन करने के लिए सेट करेंइंटरवल (...) से लौटा दिया गया और क्लीयर किए गए वैरिएबल को क्लियरइंटरवल () में पास करें;

जैसे

var timer, intervalInSec = 2;

timer = setInterval(func, intervalInSec*1000, 30 ); // third parameter is argument to called function 'func'

function func(param){
   console.log(param);
}

// कहीं भी आप कॉल क्लीयरइंटरवल के ऊपर घोषित टाइमर तक पहुंच सकते हैं

$('.htmlelement').click( function(){  // any event you want

       clearInterval(timer);// Stops or does the work
});

1
var keepGoing = true;
setInterval(function () {
     if (keepGoing) {
        //DO YOUR STUFF HERE            
        console.log(i);
     }
     //YOU CAN CHANGE 'keepGoing' HERE
  }, 500);

आप इवेंट श्रोता को जोड़कर अंतराल को रोक सकते हैं, आइए "आईडी-स्टॉप-अंतराल" के साथ एक बटन कहने दें:

$('buuton#stop-interval').click(function(){
   keepGoing = false;
});

HTML:

<button id="stop-interval">Stop Interval</button>

नोट: अंतराल अभी भी निष्पादित किया जाएगा, हालांकि कुछ भी नहीं होगा।


2
यह वास्तव में प्रदर्शन के लिए वापस आ गया है, और पृष्ठभूमि टैब के लिए, यह वास्तव में सभी अन्य टाइमर को बहुत धीमा कर देगा क्योंकि समय और अंतराल पृष्ठभूमि टैब के लिए थ्रॉटल किए जाते हैं
फेरीबग

1

इस तरह मैंने 10 सेकंड के बाद टाइमर को रोकने के लिए clearInterval () विधि का उपयोग किया।

function startCountDown() {
  var countdownNumberEl = document.getElementById('countdown-number');
  var countdown = 10;
  const interval = setInterval(() => {
    countdown = --countdown <= 0 ? 10 : countdown;
    countdownNumberEl.textContent = countdown;
    if (countdown == 1) {
      clearInterval(interval);
    }
  }, 1000)
}
<head>
  <body>
    <button id="countdown-number" onclick="startCountDown();">Show Time </button>
  </body>
</head>


1

कुछ समय के बाद अंतराल को रोकने के लिए setTimeOut का उपयोग करें।

var interVal = setInterval(function(){console.log("Running")  }, 1000);
 setTimeout(function (argument) {
    clearInterval(interVal);
 },10000);

0

मुझे लगता है कि निम्नलिखित कोड मदद करेगा:

var refreshIntervalId = setInterval(fname, 10000);

clearInterval(refreshIntervalId);

आपने कोड 100% सही किया है ... तो ... समस्या क्या है? या यह एक ट्यूटोरियल है ...


-3

क्यों नहीं एक सरल दृष्टिकोण का उपयोग करें? एक वर्ग जोड़ें!

बस एक वर्ग जोड़ें जो अंतराल को कुछ भी नहीं करने के लिए कहता है। उदाहरण के लिए: होवर पर।

var i = 0;
this.setInterval(function() {
  if(!$('#counter').hasClass('pauseInterval')) { //only run if it hasn't got this class 'pauseInterval'
    console.log('Counting...');
    $('#counter').html(i++); //just for explaining and showing
  } else {
    console.log('Stopped counting');
  }
}, 500);

/* In this example, I'm adding a class on mouseover and remove it again on mouseleave. You can of course do pretty much whatever you like */
$('#counter').hover(function() { //mouse enter
    $(this).addClass('pauseInterval');
  },function() { //mouse leave
    $(this).removeClass('pauseInterval');
  }
);

/* Other example */
$('#pauseInterval').click(function() {
  $('#counter').toggleClass('pauseInterval');
});
body {
  background-color: #eee;
  font-family: Calibri, Arial, sans-serif;
}
#counter {
  width: 50%;
  background: #ddd;
  border: 2px solid #009afd;
  border-radius: 5px;
  padding: 5px;
  text-align: center;
  transition: .3s;
  margin: 0 auto;
}
#counter.pauseInterval {
  border-color: red;  
}
<!-- you'll need jQuery for this. If you really want a vanilla version, ask -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<p id="counter">&nbsp;</p>
<button id="pauseInterval">Pause</button></p>

मैं उम्र के लिए इस तेज़ और आसान दृष्टिकोण की तलाश कर रहा हूं, इसलिए मैं कई संस्करणों को पोस्ट कर रहा हूं ताकि इसे अधिक से अधिक लोगों तक पहुंचाया जा सके।


17
वास्तव में मेरे लिए आसान नहीं लगता ... मुझे भी लगता है कि कुछ भी नहीं करने वाले कार्यों के लिए कॉल रखने के बजाय अपने अंतराल को हटाने के लिए क्लीनर है।
रोमेन ब्रॉन

मैं सहमत नहीं हूँ। this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //do something } }, 500);आप सभी कोड के लिए है। इसके अलावा, चेक पहली चीज है जो आप करते हैं, इसलिए जब यह मँडरा जा रहा हो तो यह बहुत हल्का होता है। यह वही है जो इसके लिए है: अस्थायी रूप से एक फ़ंक्शन को रोकना । यदि आप इसे अनिश्चित काल के लिए समाप्त करना चाहते हैं: बेशक आप अंतराल को हटा दें।
आरट डेन्स ब्राबर

यह मतदान के लिए राशि है और आम तौर पर हतोत्साहित किया जाता है। यह सीपीयू को कम शक्ति वाले राज्यों से जगाएगा (संभावित) बेकार की जांच करने के लिए। यह इस उदाहरण में तत्काल 0 से 500 एमएस के बीच प्रतिक्रिया को भी विलंबित करता है।
चार्ली

मैं पूरी तरह से आपसे सहमत नहीं हूं, जबकि मैंने 2 साल पहले कोड लिखा था। काउंटर वैसे भी होना चाहिए, क्योंकि ओपी ने इसके लिए कहा। निश्चित रूप से, यदि आप बटन दबाने के बाद काउंटर को रोकने के लिए इसका उपयोग कर रहे हैं, उदाहरण के लिए, यह एक उप-इष्टतम समाधान होगा, लेकिन बस एक मंडरा के लिए जब मँडरा, यह उपलब्ध सबसे सरल समाधानों में से एक है।
आर्टर्ट डेन बीबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.