2016-10-18 3 views
0

おはようございます、通話中にメソッドをリセットするにはどうすればよいですか?

私は現在、JavaScriptの問題をここで抱えています。

私はこのhttp://jsfiddle.net/pdb4kb1a/2に基づいて自動化されたスライドショーループを持っています。

また、画像に矢印が追加されているため、ユーザーは自分自身を前後に移動できる必要があります。 ここで問題となるのは、onClick()を呼び出すと、「中断」や「リセット」せずにslideShow(n)メソッドを再呼び出しすることです。 それでは、私が終わるのは、もう一方がまだ実行されている間にループを呼び出すことです。これは、矢印ボタンをクリックした後、非常に高速で途方もないループを作成します。

呼び出し時にslideShow()ループをリセットするにはどうすればよいですか?

var imgArray = ['img/sleutels.jpg', 'img/naamborden.jpg', 'img/leer.jpg']; 
var photoIndex = 2;                
var photoId = document.getElementById('photoSlide'); 



function setIndex(n) {       
    slideShow((photoIndex + n));        
} 


function slideShow(n) { 
    photoId.className += "fadeOut";            
    setTimeout(appear, 500);              
    photoIndex++; 
    if (photoIndex == imgArray.length) {           
     photoIndex = 0; 
    } 
    console.log(photoIndex); 
    setTimeout(slideShow, 5000);             
} 


function appear() { 
    photoId.src = imgArray[photoIndex];  
    photoId.className = "";      
} 


slideShow(); 

種類は

+0

jsfiddleで問題を確認できるデモを作成できますか? –

+0

'setIndex(2)' – Rajesh

+0

@Rajeshを試したことがありますか?それはOPのリファレンスのバイブルリンクです。彼の仕事上の問題はありません。右? –

答えて

0

を役に立てば幸い:

var appearId, showId; 

function setIndex(n) { 
    slideShow((photoIndex + n)); 
} 

function slideShow(n) { 
    photoId.className += "fadeOut"; 
    photoIndex++; 

    if (photoIndex == imgArray.length) { 
     photoIndex = 0; 
    } 
    console.log(photoIndex); 

    if (appearId) { clearTimeout(appearId) } 
    appearId = setTimeout(appear, 500); 
} 

function appear() { 
    photoId.src = imgArray[photoIndex]; 
    photoId.className = ""; 

    if (showId) { clearTimeout(showId) } 
    showId = setTimeout(slideShow, 4500); 
} 

slideShow(); 
+0

これはimmediatly私のために働いた、それはちょうど私がまだ時間を費やした後でも私はまだ助けを要求していることを私にバグ...でも、私は感謝しています! –

+0

ニース...私もそれをテストしていない:)。プログラミングの年、私はあなたの靴の中にいることを覚えています。それは時間を、それは何年もかかる。 – wayofthefuture

+0

appearId = setTimeout(出現、500)と言ったときに私が完全に理解していないことが1つありますが、これも関数を直接呼び出していますか?構文上、valを実際に呼び出すのではなく、単に 'fill'のように見えるからです。 –

0

について、あなたは変数にスライドショーのタイムアウトを保存し、onclickの中でそれをリセットしてみましたか?そのような何か:

var imgArray = [ 
 
    'http://placehold.it/300x200', 
 
    'http://placehold.it/200x100', 
 
    'http://placehold.it/400x300'], 
 
    curIndex = 0; 
 
    imgDuration = 3000; 
 

 
var slideTimeout; 
 

 
document.getElementById('nextButton').addEventListener('click', onNextClick); 
 

 
function slideShow() { 
 
    document.getElementById('slider').className += "fadeOut"; 
 
    setTimeout(function() { 
 
     document.getElementById('slider').src = imgArray[curIndex]; 
 
     document.getElementById('slider').className = ""; 
 
    },1000); 
 
    nextIndex(); 
 
    slideTimeout = setTimeout(slideShow, imgDuration); 
 
} 
 
slideShow(); 
 

 
function onNextClick(domEvent){ 
 
    if (slideTimeout) 
 
    clearTimeout(slideTimeout); 
 
    
 
    nextIndex(); 
 
    slideShow(); 
 
} 
 

 
function nextIndex(){ 
 
    curIndex++; 
 
    if (curIndex == imgArray.length) { curIndex = 0; } 
 
}
#nextButton{ 
 
    background-color: #aaa; 
 
    padding:4px 12px; 
 
    margin-bottom: 20px; 
 
} 
 

 
#slider { 
 
    opacity:1; 
 
    transition: opacity 1s; 
 
    display: block; 
 
} 
 

 
#slider.fadeOut { 
 
    opacity:0; 
 
}
<span id="nextButton">NEXT</span> 
 
<img id="slider" src="http://placehold.it/50x200">

私はあなただけにこのコードを強化するために持っている...本当にあなたがインデックスを扱うが、それが動作する方法好きではないので、変更するには、いくつかのコードがまだあります「前」の画像を処理し、あなたが望むものを持っているでしょう;)それはタイムアウトのIDを格納し、それをクリアした後、私は巣タイムアウトをだろう、より良い構造について

+0

これは、しばらくの間頭に入ったが、もうそれを働かせることに集中できませんでした。ありがとう、私はそれを行くだろう! –

+0

不幸にも私は同じループに入っていて、「新しいIDを設定してください」ということを理解していないかもしれません。ここでは、slideshow_timeout = setTimeout(slideShow、5000)を設定し、スライドショーを呼び出します。 –

+0

あなたのスニペットを使って自分の投稿を更新しました;質問がある場合は教えてください –

関連する問題