2017-08-23 11 views
0

私は現在、建築家のための小さなウェブサイトを開発しています。 私の目標は、できるだけシンプルにすることです。javascriptスライダーsettimeoutの問題

したがって、サイトを1ページのサイトとして作成しました。再ロードせずに、PHPを使用せずに、さまざまなサブページをブラウズすることができます。ちょうどHTML5とCSS3。

しかし、クライアントはプロジェクトをスライド可能にしたいと考えています。 幸いにも私はw3(https://www.w3schools.com/howto/howto_js_slideshow.asp)の適切なスライダーを見つけました

私は前と次のボタン、自動スライドとバニラJSを使用して見つけることができたのは一番簡単でした。 スライダを使用してプロジェクトを参照できます。 コンテンツはフォアグラウンドでリッテスペースを使用するだけで、プロジェクトの画像はウェブサイトの背景全体を置き換えます。 しかし、私は夢中になっているsetTimeoutを使用しています。

ユーザーが次のまたは前のボタンを押していない限り、すべてが完璧に機能します。スライドショーが狂っています。 (確かに、この問題はかなり一般的で、stackoverflowにはいくつかのスレッドがありますが、私のプロジェクトには適切な答えが見つかりませんでした!)

私はいくつかのことを試みましたが、 JavaScript。

<script> 
"use strict"; 
var slideIndex = 1; 
showDivs(slideIndex); 

function plusDivs(n) { 
showDivs(slideIndex += n); 
} 

function showDivs(n) { 
var i; 
var x = document.getElementsByClassName("mySlides"); 
    if (n==undefined){n = ++slideIndex;} 
if (n > x.length) {slideIndex = 1;} 
if (n < 1) {slideIndex = x.length;} 
for (i = 0; i < x.length; i++) { 
    x[i].style.display = "none"; 
} 
x[slideIndex-1].style.display = "block"; 
setTimeout(showDivs, 8000); // Change image every 8 seconds 
} 
</script> 

これは現在使用しているコードです。 各スライドの後にタイマーをリセットする方法はありますか? clearTimeoutについて読んだことがありますが、正常に動作しませんでした。

何か助けていただければ幸いです。みんなありがとう。

+0

'の最後に設定されたタイムアウトをクリアする必要がある(とpotentionally新しいものを開始)。 'showDivs'関数の外でグローバル変数(' var timeoutId = null'など)を設定する必要があります。setTimeoutを 'timeoutId = setTimeout(showDivs、8000);'と呼び、 'if(timeoutId){clearTimeout (timeoutId)} 'を' plusDivs'コールバックで返します。 スライダーライブラリ(例:Slick)を使用することをおすすめします。すべての設定は次のようになります: '$( 'mySlides')。slick();' – Yoshi

+0

あなたの高速回答に感謝します。 これは私に問題のよりよい理解を与えました。 – Chrtz

答えて

0

あなたは、あなたがclearTimeout` `に使用できる時間のIDを返しますsetTimeout` showDivs

<script> 
"use strict"; 
var slideIndex = 1; 
var timeOutId; 
showDivs(slideIndex); 

function plusDivs(n) { 
    showDivs(slideIndex += n); 
} 

function showDivs(n) { 
    // Stop the timeout from triggering. 
    clearTimeout(timeOutId); 

    var i; 
    var x = document.getElementsByClassName("mySlides"); 
    if (n==undefined){n = ++slideIndex;} 
    if (n > x.length) {slideIndex = 1;} 
    if (n < 1) {slideIndex = x.length;} 
    for (i = 0; i < x.length; i++) { 
     x[i].style.display = "none"; 
    } 
    x[slideIndex-1].style.display = "block"; 
    // Schedule a new timeout. 
    timeOutId = setTimeout(showDivs, 8000); // Change image every 8 seconds 
} 

+0

ところで、問題はsetTimeoutでした。 'showDivs'メソッドの実行から8秒後にトリガされます。タイムアウトは、スクリプトの最初の 'showDivs(slideIndex)'で設定されます。 'plusDivs'は' showDivs'メソッドも呼び出します。タイムアウトをクリアしないと、 'showDivs'の呼び出しごとにタイムアウトが追加されます。タイムアウトが一見無作為に発生するため、これは実際には奇妙な視覚的な振る舞いにつながります。 – Thijs

0

ああ、タイムアウトを変数に保存してキャンセルできるように、コードを変更する必要があります。

var timer; 
function showDivs (n) { 
    /* the code */ 
    if (timer) clearTimeout(timer) 
    timer = setTimeout(showDivs, 8000); 
} 
+0

これもうまくいくようです。 ちょうどどこにclearTimeout関数を呼び出すか分からなかった – Chrtz