2012-01-06 17 views
9

içinde yer alan, thats Okumayı kolaylaştırmak için işlevini basitleştirdik.böyle çalışır JavaScript bir özyinelemeli tip fonksiyonu var bir işlev

"A" nın etiketleri Ancak, zamanlayıcı clearout etmediğimiz bu

<a href="#" onclick="loadThumb(3); clearTimeout(rotate);">Load thumb 3</a> 

gibi çağrıda, zamanlayıcı çağrıldığını clearTimeout() işlevi aldırmaksızın dolaşmak devam eder.

Herhangi bir fikir neden? Bir kapsam problemiyle veya bunun gibi bir şeyle ilgisi olabilir. döndürme penceresi kapsamında olacağından linke

Eğer var döndürme kullandığınız Since sahte

cevap

13

Evet, bir global değişken döndürmek yapmak gerekir. Basitçe şöyle fonksiyonu dışında beyan:

var rotate; 
var delay = 1000; 

function loadThumb(thumb) { 
    alert("loading thumb: " + thumb); 
    rotate = setTimeout(function() { 
     loadThumb(thumb + 1); 
    }, delay); 
} 

Ayrıca, size loadThumb diyoruz sen önce zaman aşımı temizlemek emin olmak gerekir. Aksi halde başlattığınız zamanlayıcıyı temizlersiniz.

<a href="#" onclick="clearTimeout(rotate); loadThumb(3);">Load thumb 3</a> 

keman: Birden zaman aşımları yönetmek varsa http://jsfiddle.net/63FUD/

+0

ve false değerini döndür. Ve var döndürme sahip olmama o pencereleri kapsamalıdır. – mplungjan

+0

Oh evet bu benim yaptığım şey, şaşkınlığa uğradıktan sonra onu arıyordu, şimdi çalışıyor. Teşekkürler. – Talon

0

Dönüş, bir kapsam sorunu olmamalıdır. Tam kodu gösterebilir misin?

senaryoyu satır içi zayıf kodlama kabul edilir - sen de

Bir görüntünün

deneyin çağrısında olabilecek bir işlev içinde setTimeout olmamalıdır sayfanın olay işleyicisi onload eklemelidir Bu: varsayarak

var rotate,next=1; 
function loadThumb(thumb) { 
    if (thumb) ... use thumb 
    else ... use next 
} 

function slide() { 
    rotate=setInterval(function() { 
     loadThumb(); 
     next++; 
     if (next>=images.length) next=0; 
    }, delay); 
} 

window.onload=function() { 
    var links = document.getElementsByTagName("a"); 
    if (links[i].className==="thumbLink") { 
    links[i].onclick=function() { 
     var idx = this.id.replace("link",""); 
     loadThumb(idx); 
     clearInterval(rotate); 
     return false; 
    } 
    } 
    document.getElementById("start").onclick=function() { 
    slide(); 
    return false; 
    } 
    document.getElementById("stop").onclick=function() { 
    clearInterval(rotate); 
    return false; 
    } 
    slide(); 
} 

<a href="#" id="start">Start</a> 
<a href="#" id="stop">Stop</a> 

<a href="#" id="link0" class="thumbLink">Show 1</a> 
<a href="#" id="link1" class="thumbLink">Show 2</a> 
<a href="#" id="link2" class="thumbLink">Show 3</a> 
2

o kadar genel değişken olarak döndürmek olun ve dışarıdan rotate ilan değilse clearTimeout(rotate);

clearTimeout() example

1

Bu bir kapsam sorun olabilir bakın diyoruz kapsam sorun olabilir. bildiğim kadarıyla görebiliyorum gibi tüm kod sonrası etmedi çünkü yaptığınızı tam olarak emin değilim

var rotate = 0; 
function loadThumb(thumb) { 

    rotate=setTimeout(function() { 
     loadThumb(next); 
    }, delay); 

} 
0

, ama bu benim için daha iyi görünüyor:

bu deneyin

function loadThumb(thumb) { 

    return setTimeout(function() { 
     loadThumb(next); 
    }, delay); 

} 

ve sonra:

<a href="#" onclick="clearTimeout(loadThumb(3));">Load thumb 3</a> 
+0

jsFiddle http://jsfiddle.net/AGpzs/ üzerine bir örnek gönderdiniz: - varsayılan - ve neden işlevinde yanlış dönüş? – mplungjan

+0

[label] (https://developer.mozilla.org/en/JavaScript/Guide/Statements#label_Statement) 'javascript:' burada yanlış değil, ya da kullanımda değildir. Aynı zamanda foo: 'veya' bar: 'veya' sfgasdga: 'yazabilirsiniz. İnsanların gerekli olduğunu düşündüğünden, lütfen kaldırın. @mplungjan: Ben * varsayılan * demezdim. Bağlantılarda (URL'ler), tarayıcının ne yapması gerektiğini bilmesi için bir tür protokol olarak kullanılır, ancak "on *" öznitelikleri her zaman JavaScript olarak yorumlanır (belki de bu durumda, nvm;)). –

+0

Bana göre, bu bir LABEL değil, gelen kodun javascript olduğunu tarayıcıya anlatmaktır. Sadece tarayıcı IE ise ve sayfadaki İLK komut dosyası VBScript ise YALNIZCA yararlıdır, çünkü (en azından alışkındır) varsayılan dili inline olay işleyicilerinde VBScript'e ayarlayacaktır. – mplungjan

0

, kendi zaman aşımı oluşturmak ve kaldırmak için küresel kapsamı ve bazı özel yöntemlerle bir nesneyi kullanabilirsiniz. Metotlara erişmek için, çağrıları bağlantılarınızın onclick işleyicisine koyabilirsiniz (örnekte olduğu gibi) ya da bunları bağlamak için jQuery gibi bir kitaplık kullanabilirsiniz.

<script type="text/javascript"> 
    var timeouts = timeouts || {}; 

    function createTimeout(name, milliseconds, callback) { 
     timeouts.name = setTimeout(callback, milliseconds); 
    } 

    function removeTimeout(name) { 
     if (typeof(timeouts.name) !== undefined) { 
      clearTimeout(timeouts.name); 
      timeouts.name = undefined; 
     } 
    } 

    createTimeout('foo', 5000, function() { 
     alert('timeout') 
    }); 
</script> 

ben de neden javascript

İlgili konular