Слишком много рекурсии с jQuery.load и картинками - PullRequest
0 голосов
/ 12 октября 2010

У меня странная, случайная проблема. Вот пример моего проблемного кода. Его целью является создание элемента управления jQuery jCarousel для списка элементов ul / li. Но мне нужно, чтобы элементы внутри были вертикально отцентрированы, поэтому я рассчитываю верхний отступ для каждого из них, как только загруженное изображение будет загружено.

<script type="text/javascript">
jQuery(document).ready(function () {
    jQuery("#caroussel-cards").jcarousel({ "wrap": 'both', "animation": 800, "scroll": 4, "auto": 6, "easing": 'easeInOutQuint' });
    console.log(jQuery("#caroussel .visual img").length); // Always returns 11
    jQuery("#caroussel .visual img").load(function (event) {
        var img = jQuery(this);
        console.log(img.attr('src'));
        img.css('paddingTop', (156 - img.height()) / 2); // 156 is carousel's height
    });
});
</script>

<div id="caroussel">
    <ul id="caroussel-cards" class="jcarousel-skin-cards">
        <!-- Actually there are 11 li elements -->
        <li>
            <div class="visual">
                <a href="#"><img src="/Content/img/check.jpg" border="0" alt="" /></a>
                <a href="#" class="bt_command"></a>
            </div>
        </li>
    </ul>
</div>

Ошибка встречается очень случайно, но выглядит следующим образом:

  • С этим кодом и только с этим кодом: в Firefox 3.6 только некоторые картинки будут проходить через load () совершенно случайно; в IE8 никакая картинка вообще не пройдет через load (), даже нажав Ctrl + R.

  • Проблема IE привела меня к использованию этого плагина , который, согласно документации jQuery, может помочь при наличии помех между кешем браузера и событием load (). Результатом является то, что сейчас, иногда это работает, а иногда (совершенно случайно, Ctrl + R или нет) у меня есть сообщения «слишком много рекурсии» в Firefox и исключения «Недостаточно памяти» в IE. Второй файл console.log в моем коде показывает, что некоторые изображения загружаются несколько раз.

Что бы ни случилось, jCarousel загружен правильно, и первый файл console.log возвращает, что в карусели 11 изображений.

Обычно сообщение «слишком много рекурсии» происходит из-за бесконечного цикла, но я не вижу его в своем коде. Я невежественен.

1 Ответ

0 голосов
/ 12 октября 2010

Используете ли вы последнюю версию jCarousel? Когда я пробую ваш код, я получаю исключение из jCarousel, в котором говорится, что, поскольку для элементов не заданы ширина и высота, возникает бесконечный цикл, который, если его не обработать в вашей версии, объяснит вашу «слишком большую рекурсию» и ошибки нехватки памяти.

Попробуйте пропустить добавив опцию

itemFallbackDimension: 10

к вашему объекту опций jCarousel и посмотрите, улучшатся ли вещи. (Значение 10 здесь произвольно, используйте все, что вам нравится)

...