ホームページに大きな画像が表示されており、ユーザーが「next_img」ボタンをクリックすると、ホームページの大きな画像が配列内の次の画像に変更されます。
ただし、クリックしても次の矢印は何もせず、ホームページのメイン画像は変わりません。
これをjavascriptで行う必要があります。
HTMLで:
<!--Main Content of the page -->
<div id="splash">
<img src="images/img/Splash_image1.jpg" alt="" id="mainImg">
</div>
<div id="imglist">
<a href="javascript:nextImage('mainImg')"><img src="images/next_img.png" alt=""></a>
そして、javascriptファイルで:
var imgArray = new Array();
imgArray[0] = new Image();
imgArray[0].src = 'images/img/Splash_image1.jpg';
imgArray[1] = new Image();
imgArray[1].src = 'images/img/Splash_image2.jpg';
imgArray[2] = new Image();
imgArray[2].src = 'images/img/Splash_image3.jpg';
imgArray[3] = new Image();
imgArray[3].src = 'images/img/Splash_image4.jpg';
imgArray[4] = new Image();
imgArray[4].src = 'images/img/Splash_image5.jpg';
imgArray[5] = new Image();
imgArray[5].src = 'images/img/Splash_image6.jpg';
/*------------------------------------*/
function nextImage(element)
{
var img = document.getElementById(element);
for(var i = 0;i<imgArray.length;i++)
{
if(imgArray[i] == img)
{
if(i == imgArray.length)
{
var j = 0;
document.getElementById(element).src = imgArray[j].src;
break;
}
else
var j = i + 1;
document.getElementById(element).src = imgArray[j].src;
break;
}
}
}
任意の助けをいただければ幸いです。ありがとう。
Diodeusが言ったように、あなたはImage
をHTMLDomObject
と比較しています。代わりに、.src
属性:
var imgArray = new Array();
imgArray[0] = new Image();
imgArray[0].src = 'images/img/Splash_image1.jpg';
imgArray[1] = new Image();
imgArray[1].src = 'images/img/Splash_image2.jpg';
/* ... more images ... */
imgArray[5] = new Image();
imgArray[5].src = 'images/img/Splash_image6.jpg';
/*------------------------------------*/
function nextImage(element)
{
var img = document.getElementById(element);
for(var i = 0; i < imgArray.length;i++)
{
if(imgArray[i].src == img.src) // << check this
{
if(i === imgArray.length){
document.getElementById(element).src = imgArray[0].src;
break;
}
document.getElementById(element).src = imgArray[i+1].src;
break;
}
}
}
また、最後の画像を確認するときは、imgArray.length-1
と比較する必要があります。たとえば、配列の長さが2の場合、値0と1を取得するため、値2に到達しないため、長さではなく長さ-1と比較してください。ここに固定行があります。
if(i == imgArray.length-1)
これを実装する、いくぶんクリーンな方法を次に示します。これにより、次の変更が行われます。
.src
属性がDOM要素ではなく、適切に機能するようにします。コード:
function imageCache(base, firstNum, lastNum) {
this.cache = [];
var img;
for (var i = firstNum; i <= lastnum; i++) {
img = new Image();
img.src = base + i + ".jpg";
this.cache.Push(img);
}
}
imageCache.prototype.nextImage(id) {
var element = document.getElementById(id);
var targetSrc = element.src;
var cache = this.cache;
for (var i = 0; i < cache.length; i++) {
if (cache[i].src) === targetSrc) {
i++;
if (i >= cache.length) {
i = 0;
}
element.src = cache[i].src;
return;
}
}
}
// sample usage
var myCache = new imageCache('images/img/Splash_image', 1, 6);
myCache.nextImage("foo");
このオブジェクト指向で乾燥したアプローチのいくつかの利点:
追伸DRYが何を表しているのかわからない場合、それは "自分自身を繰り返さない"ことであり、基本的には、似たようなコードのコピーを多く持つべきではないことを意味します。ループや関数、または同じように見えるコードのコピーの多くの必要性を排除する何かに何らかの形で削減されます。最終結果は小さくなり、通常、保守が容易になり、再利用可能になります。
これは簡単な例であり、いくつかの変更を使用してそれをあなたのものと組み合わせてみてください。コードを読みやすく短くするために、すべての画像を1つの配列に設定することをお勧めします。
var myImage = document.getElementById("mainImage");
var imageArray = ["_images/image1.jpg","_images/image2.jpg","_images/image3.jpg",
"_images/image4.jpg","_images/image5.jpg","_images/image6.jpg"];
var imageIndex = 0;
function changeImage() {
myImage.setAttribute("src",imageArray[imageIndex]);
imageIndex = (imageIndex + 1) % imageArray.length;
}
setInterval(changeImage, 5000);
問題は次のとおりです。
if(imgArray[i] == img)
配列要素をDOMオブジェクトと比較しています。