コードにはいくつかの機能上の問題があります。
- body タグの onload 属性のコードが正しく閉じられていませんでした
- changeBanner 内のコードは常にすべての if ステートメントを実行し、イメージ サイクルを進めることはありません。
修正に関係なく、コードを少しきれいにすることができます。body タグからインライン スクリプトを削除し、インデックスを使用してセット内の現在の画像を追跡することで if ステートメントの問題を修正します。
あなたのようなHTMLがあり、3つの画像がすべてで始まると仮定しますhidden
:
<body>
<div id="wrapper">
<div>
<img src="http://placehold.it/100x150" width="300px" height="150px" hidden />
<img src="http://placehold.it/200x250" width="300px" height="150px" hidden />
<img src="http://placehold.it/300x350" width="300px" height="150px" hidden />
</div>
</div>
</body>
onload
の属性を使用する必要はありませんbody
。
代わりに使用すると、DOM の準備が整い、すべての画像がロードされたwindow.onload
後に、イベント後に自動的に呼び出される関数を割り当てることができます。load
できれば、すべてのスクリプト コードを別の.js
ファイルに格納し、それへの参照のみを HTML に含めることをお勧めします。ただし、単純にするために、現在のアプローチに近づきました。
その関数内で、次のように変数を設定してから間隔を開始できます。
<script type="text/javascript">
var currentImageIndex = -1,
maxImageIndex = 0,
images = [],
changeInterval = 1500;
// prepares relevant variables to cycle throguh images
var setUp = function() {
images = document.images;
maxImageIndex = images.length;
currentImageIndex = 0;
};
// changes the banner currently being displayed
var changeBanner = function() {
var i;
// either re-set the index to 0 if the max length was reached or increase the index by 1
currentImageIndex = (currentImageIndex >= maxImageIndex - 1) ? 0 : currentImageIndex += 1;
for (i = 0; i < maxImageIndex; i += 1) {
images[i].hidden = (i !== currentImageIndex);
}
};
// a function which is triggered following the `load` event
window.onload = function() {
setUp();
images[currentImageIndex].hidden = false; // show the first banner image;
setInterval(changeBanner, changeInterval); // following a delay, keep changing the banner image by the specified interval
};
</script>
デモ- 論理的な問題を修正して使用するwindows.onload()