JavaScript'te set aramasını durdurma


1398

setInterval(fname, 10000);JavaScript'te her 10 saniyede bir işlevi çağırmak için kullanıyorum . Bir etkinlikte aramayı durdurmak mümkün mü?

Kullanıcının verilerin tekrar tekrar yenilenmesini durdurabilmesini istiyorum.

Yanıtlar:


2160

setInterval()aşağıdakilere iletebileceğiniz bir aralık kimliği döndürür clearInterval():

var refreshIntervalId = setInterval(fname, 10000);

/* later */
clearInterval(refreshIntervalId);

Belgelerine bakınız setInterval()ve clearInterval().


42
'ClearInterval ()' ile durduktan sonra tekrar nasıl başlatabilirsiniz? Yeniden başlatmayı denersem 2 kat setInterval çalışıyorum.
Dan

8
Ben de Her zaman SetInterval (MyFunction, 4000) kullanmak istiyorum; daha hızlı ve daha hızlı olsun, her seferinde 2 kat daha hızlı :( nasıl bir setinterval yeniden başlatabilirim?
Alireza Masali

14
SetInterval (), geçtiğiniz hızı değiştirmez. Ne yaparsa yapın, SetInterval () öğesini her çağırışınızda hızlanırsa, aynı anda çalışan ve yeni bir soru açması gereken birden fazla kronometreniz olur.
EpicVoyage

29
Gerçekten durdurduğunuzdan emin olun. Değişken kapsam belirleme nedeniyle, aramak için doğru kimliğiniz olmayabilir clearInterval. window.refreshIntervalIdYerel bir değişken yerine kullandım ve harika çalışıyor!
osa

2
Ben (ilgili olduğunda) ilişkili elemanına setInterval tanıtıcısı eklemeye başladım: $('foo').data('interval', setInterval(fn, 100));ve sonra temizleyerek clearInterval($('foo').data('interval'));ben de bunu yapmak için bir jQuery yolu yok eminim.
Michael - Clay Shirky

105

setIntervalBir değişkenin dönüş değerini ayarlarsanız , bunu clearIntervaldurdurmak için kullanabilirsiniz .

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

Bu ve John'un cevabı arasındaki farkı görmüyorum
Bobtroopo

51

Yeni bir değişken ayarlayabilir ve her çalıştığında ++ (bir sayım) tarafından artırılmasını sağlayabilirsiniz, sonra onu sonlandırmak için bir koşullu ifade kullanın:

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

Umarım yardımcı olur ve doğrudur.


3
Bunun işe yaradığını öğrenince şaşırdım clearInterval(varName);. Beklediğim clearIntervalo aralık kimliği gerekli düşünce, fonksiyon adı geçtiğinde çalışmamasına. Bu, yalnızca adlandırılmış bir işleve sahipseniz çalışabilir, çünkü anonim bir işlevi kendi içinde bir değişken olarak geçiremezsiniz.
Patrick M

31
Aslında işe yaramadığını düşünüyorum. Kod, sayaç üzerindeki kısıtlama nedeniyle yürütülüyor, ancak aralık varName () tetiklemeye devam ediyor. ClearInterval () (else yan tümcesinin içinde) sonra herhangi bir şeyi günlüğe kaydetmeyi deneyin ve sonsuza kadar yazıldığını göreceksiniz.
Rafael Oliveira

5
Pek işe yaramayan bir şey için çok upvotes, bazen SO üzerinde insanları anlamıyorum: P
Stranded Kid

2
$(document).ready(function(){ });jQuery, bu yüzden çalışmıyor. En azından bundan bahsedilmeliydi.
paddotk

4
@OMGrant, Çalışmayan bir örneğe ek olarak varName, adlandırılmamış bir işlevi depolayan adlı bir değişkeniniz var - ne ?? Bu cevabı değiştirmeniz veya kaldırmanız gerekiyor, IMHO.
Dean Radcliffe

13

Yukarıdaki cevaplar, setInterval'in bir tanıtıcıyı nasıl döndürdüğünü ve bu tanıtıcı Aralık zamanlayıcısını iptal etmek için nasıl kullanıldığını zaten açıkladı.

Bazı mimari düşünceler:

Lütfen "kapsamsız" değişkenler kullanmayın. En güvenli yol, bir DOM nesnesinin niteliğini kullanmaktır. En kolay yer "belge" olacaktır. Tazeleme bir başlatma / durdurma düğmesiyle başlatılırsa, düğmenin kendisini kullanabilirsiniz:

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

İşlev, düğme tıklama işleyicisinin içinde tanımlandığından, yeniden tanımlamanız gerekmez. Düğmeye tekrar tıklanırsa zamanlayıcı kaldığı yerden devam edebilir.


1
Ne üzerine koyarak hakkında daha iyi documentolduğundan daha window?
icktoofay

1
düzeltme. Belgeyi söylemek istedim. Kod örneğimde, düğmenin kendisini etkili bir şekilde kullanıyorum. Düğme için bir kimlik yok, ancak "bu" işaretçi işlevdeki "d" parametresine bağlı. Fonksiyonlar da olduğu için kapsam riskli olarak "pencere" kullanmak. Örneğin, "fonksiyon testi () {}", bir kapsam kullanmamakla aynı olan window.test aracılığıyla erişilebilir, çünkü bir stenondur. Bu yardımcı olur umarım.
Schien

1
"kapsam-daha az" değişkenleri kaybetmeyin -> "kapsam-daha az" kullanmayın Ben bunu düzenlerdim, ama değişiklik 6 harften az ve hata kafa karıştırıcı.
Leif Neland

2
Bunun için DOM'ye ihtiyacınız yok. Küresel kapsam kirliliğinden kaçınmak için sadece bir IIFE.
Onur Yıldırım

1
Tekrar çalışması için 'd.interval = undefined' sonra innerhtml = 'start' eklemeliyim. Çünkü böyle sadece bir kez çalışır.
jocmtb

11

Zaten cevap ... Ama aynı zamanda farklı aralıklarla birden fazla görevleri destekleyen bir özellikli, yeniden kullanılabilir zamanlayıcı gerekiyorsa, benim kullanabilirsiniz TaskTimer (Düğüm ve tarayıcı için).

// 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();

Sizin durumunuzda, kullanıcılar veri yenilemesini bozmak için tıkladığında; Ayrıca arayabilir timer.pause()sonra timer.resume()onlar gerekiyorsa yeniden etkinleştirin.

Görmek fazlasını burada .


6

ClearInterval () yöntemi, setInterval () yöntemiyle ayarlanan bir zamanlayıcıyı temizlemek için kullanılabilir.

setInterval her zaman bir kimlik değeri döndürür. Bu değer zamanlayıcıyı durdurmak için clearInterval () içinde geçirilebilir. İşte 30'dan başlayan ve 0 olduğunda duran bir zamanlayıcı örneği.

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

5

, @cnu

Konsol tarayıcısına (F12) bakmadan önce kodu çalıştırmayı denediğinizde aralığı durdurabilirsiniz ... açıklamayı deneyin : P

Örneğe bir kaynak kontrol edin:

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

SetInterval (...) öğesinden döndürülen değeri atamak için değişken bildirin ve atanan değişkeni clearInterval () öğesine iletin;

Örneğin

var timer, intervalInSec = 2;

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

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

// Yukarıda belirtilen zamanlayıcıya eriştiğiniz her yerde clearInterval çağrısı yapın

$('.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);

Aralığı, "durma aralığı" kimliğine sahip bir düğme söyleyecek bir olay dinleyicisi ekleyerek de durdurabilirsiniz:

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

HTML:

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

Not: Aralık hala yürütülecek, ancak hiçbir şey olmayacak.


2
Bu gerçekten performans için geri döndü ve arka plan sekmeleri için, zamanlayıcılar ve aralıklar arka plan sekmeleri için
kısıtlandığından

1

10 saniye sonra zamanlayıcıyı durdurmak için clearInterval () yöntemini bu şekilde kullandım.

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

Bir süre sonra aralığı durdurmak için setTimeOut öğesini kullanın.

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

0

Aşağıdaki kod yardımcı olacaktır sanırım:

var refreshIntervalId = setInterval(fname, 10000);

clearInterval(refreshIntervalId);

Kodu% 100 doğru yaptınız ... Ee ... Sorun nedir? Ya da bir öğretici ...


-3

Neden daha basit bir yaklaşım kullanmıyorsunuz? Bir sınıf ekleyin!

Sadece aralığa hiçbir şey yapmamasını söyleyen bir sınıf ekleyin. Örneğin: fareyle üzerine gelindiğinde.

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>

Yaşlar için bu hızlı ve kolay yaklaşımı arıyordum, bu yüzden mümkün olduğunca çok insanı tanıtmak için birkaç sürüm gönderiyorum.


17
Benim için gerçekten daha basit görünmüyor ... Ayrıca, hiçbir şey yapmayan işlevlere çağrı yapmak yerine aralıklarınızı kaldırmanın daha temiz olduğunu düşünüyorum.
Romain Braun

Kabul etmiyorum. this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //do something } }, 500);kod için sahip olduğunuz tek şey. Dahası, kontrol ilk yaptığınız şeydir, bu yüzden üzerine geldiğinde çok hafiftir. Bunun amacı şudur: bir işlevi geçici olarak duraklatma . Süresiz olarak sonlandırmak isterseniz: tabii ki aralığı kaldırırsınız.
Aart den Braber

Bu, yoklama anlamına gelir ve genellikle önerilmez. CPU'yu düşük güç durumlarından sadece (muhtemelen) işe yaramaz bir kontrol yapmak için uyandıracaktır. Ayrıca, bu örnekte geri bildirimi hemen 0 ile 500 ms arasında geciktirir.
Charlie

Kodu 2 yıl önce yazarken bile tamamen seninle aynı fikirde değilim. Sayaç zaten orada olmalı, çünkü OP istedi. Elbette, örneğin bir düğmeye bastıktan sonra sayacı durdurmak için kullanıyorsanız, bu, en uygun olmayan bir çözüm olacaktır, ancak sadece gezinirken bir duraklama için, bu mevcut en basit çözümlerden biridir.
Aart den Braber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.