prototype.js - IE8 - рекурсивная функция не работает после обновления - PullRequest
1 голос
/ 08 апреля 2011

У меня есть эта рекурсивная функция, где thumbs - массив объектов IMG ... У меня в Chrome, IE9, FF и т. Д. У меня все функции работают нормально, но зависает в IE8 после обновления или перехода с сайта на сайт ... Когда открывается новая вкладка, все IMG загружаются правильно, но после перезагрузки скрипт «умирает» без каких-либо признаков ошибки ... Функция вызывается из некоторой функции 'init', где должен быть инициирован массив thumbs, имя файла и т. Д. ... цените ваше время, ребята ...

function preload(thumbs) {
    last = thumbs[thumbs.length - 1];

    loadThumb(0);

    function loadThumb(th) {
        filename = thumbs[th].id.split('-')[1];
        thumbs[th].setAttribute('src', '/data/cache/thumb-' + filename + '.jpg');
        handle(th, thumbs);
        thumbs[th].observe('load', (function (event) {
            thumbs[th].setStyle({
                visibility: 'visible',
                opacity: 0.3
            });
            loadThumb(th + 1);
        }));
    }
};

last.observe('load', (function (event) {
    $('load').setStyle({
        visibility: 'hidden'
    });
    kar_width = last.positionedOffset();
    $('karusel').setStyle({
        width: kar_width[0] + last.getWidth() + 10 + 'px'
    });
    if ($('karusel').getWidth() < 700) {
        $('next').hide();
        $('prev').hide();
        $('next1').hide();
        $('prev1').hide();
    };
}));
};

1 Ответ

0 голосов
/ 08 апреля 2011

Я сомневаюсь, что это решит вашу проблему, но обычно не хорошая идея использовать setAttribute для установки источника элемента изображения, IE (особенно <9) может подавиться этим. Вместо этого используйте прямые свойства элемента DOM: </p>

thumbs[th].src = '/data/cache/thumb-' + filename + '.jpg';

Обновление: Ошибка переполнения стека в сочетании с рекурсивной функцией обычно означает, что вы находитесь в бесконечном цикле рекурсии. В этом коде:

function loadThumb(th) {
    /* ... */
    thumbs[th].observe('load', (function (event) {
        /* ... */
        loadThumb(th + 1);
    }));
}

вы никогда не выйдете из этой рекурсивной функции.

Я предлагаю вам добавить условие для выхода из всех loadThumb экземпляров, например ::

if (th < maxThumbs)
    loadThumb(th + 1);
...