Отображение изображения из массива изображений - Javascript

У меня есть большое изображение, которое показано на моей домашней странице, и когда пользователь нажимает кнопку "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;
        }
    }   
}

Любая помощь будет оценена по достоинству. Спасибо.

Ответ 1

Так же, как сказал Диодей, вы сравниваете 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;
        }
    }
}

Ответ 2

Кроме того, при проверке последнего изображения вы должны сравнивать с imgArray.length-1, потому что, например, когда длина массива равна 2, тогда я буду принимать значения 0 и 1, он не достигнет значения 2, поэтому вы должен сравниваться с длиной-1 не с длиной, вот фиксированная линия:

if(i == imgArray.length-1)

Ответ 3

Вот несколько более чистый способ реализации этого. Это приводит к следующим изменениям:

  • Код DRYed немного для удаления избыточного и повторяющегося кода и строк.
  • Код становится более универсальным/многоразовым.
  • Мы делаем кеш в объект, поэтому он имеет автономный интерфейс и меньше глобальных переменных.
  • Мы сравниваем атрибуты .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");

Некоторые преимущества этого более объектно-ориентированного и DRYed-подхода:

  • Вы можете добавить больше изображений, просто создав изображения в числовых последовательностях и изменив одно числовое значение в конструкторе, а не копируя больше строк объявлений массива.
  • Вы можете использовать это более одного места в своем приложении, просто создав несколько объектов imageCache.
  • Вы можете изменить базовый URL, изменив одну строку, а не N строк.
  • Размер кода меньше (из-за удаления повторяющегося кода).
  • Объект кеша можно легко расширить, чтобы предложить больше возможностей, таких как first, last, skip и т.д.
  • Вы можете добавить централизованную обработку ошибок в одном месте, поэтому, если одно изображение не существует и не загружается успешно, оно автоматически удаляется из кэша.
  • Вы можете повторно использовать это на других веб-страницах, которые вы разрабатываете, только изменяя аргументы конструктору и не изменяя в действительности код реализации.

P.S. Если вы не знаете, что означает DRY, это "Do not Repeat Yourself" и в основном означает, что у вас никогда не должно быть много копий аналогичного кода. Каждый раз, когда вы это делаете, его нужно как-то сводить к циклу или функции или что-то, что устраняет необходимость в большом количестве похожих копий кода. Конечный результат будет меньше, обычно легче поддерживать и часто более многократно использовать.

Ответ 4

Это простой пример и попытайтесь объединить его с вашим, используя некоторые модификации. Я предпочитаю, чтобы вы установили все изображения в одном массиве, чтобы сделать код более понятным и коротким:

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);

Ответ 5

Вот ваша проблема:

if(imgArray[i] == img)

Вы сравниваете элемент массива с объектом DOM.

Ответ 6

<script type="text/javascript">
function bike()
{
var data=
["b1.jpg", "b2.jpg", "b3.jpg", "b4.jpg", "b5.jpg", "b6.jpg", "b7.jpg", "b8.jpg"];
var a;
for(a=0; a<data.length; a++)
{
document.write("<center><fieldset style='height:200px; float:left; border-radius:15px; border-width:6px;")<img src='"+data[a]+"' height='200px' width='300px'/></fieldset></center>
}
}