Прошу помочь разобраться в ошибке, которая возникает при работе скрипта фото коллажа, описанного на хабре (https://habrahabr.ru/sandbox/78613/)
var collage = document.getElementById('collage');
var images = collage.getElementsByTagName('img');
//Маленький набор опций: averageRowHeight - примерная высота строки; gap - отступы между картинками;
var options = {averageRowHeight: 255, gap: 3};
var widths = [], rows = [], rowNumber = 0, index = 0, k = 0;
//Записываем в массив ширину каждой картинки при одинаковой высоте
for(var i = 0; i < images.length; i++){
widths.push(Math.round(images[i].width / images[i].height * options.averageRowHeight));
}
//Функция суммы элементов массива
Array.prototype.sum = function(){
return this.reduce( function(prev,current){ return +current + prev; }, 0);
}
//Разбиение оизображений на строки обичным деление общей ширины всех картинок на ширину контейнера
while(rowNumber < Math.ceil(widths.sum() / collage.clientWidth)){
rows[rowNumber] = [];
//Как только общая ширина картинок превысила ширину контейнера переходим на следующую строку
while(index < widths.length && rows[rowNumber].sum()+(rows[rowNumber].length * options.gap) < collage.clientWidth + options.gap){
rows[rowNumber].push(widths[index]);
index++;
//Если на последнюю строку осталось одно изображение, то дописываем его в "предпоследнюю"
if(index == widths.length - 1){
rows[rowNumber].push(widths[index]);
rowNumber++;
break;
}
}
rowNumber++;
}
index = 0;
//Непосредственно изменение масштаба картинок (пропорционально, без обрезания изображений)
console.log(rows);
console.log(rows.length);
for(var i = 0; i < rows.length; i++){
for(var j = 0; j < rows[i].length; j++){
// Если ширина строки больше/меньше ширины контейнера - соответственно
// уменьшаем/увеличиваем до ширины контейнера с учетем отступов между картинками
k = (collage.clientWidth - ((rows[i].length - 1) * options.gap)) / rows[i].sum();
images[index].style.width = rows[i][j] * k + 'px';
images[index].style.height = k * options.averageRowHeight + 'px';
if(j < rows[i].length - 1) images[index].style.marginRight = options.gap + 'px';
if(i < rows.length - 1) images[index].style.marginBottom = options.gap + 'px';
index++;
}
}
В браузере Safari под mac (возможно и в каких-то других) возникает ошибка
undefined is not an object (evaluating 'rows[i].length') на стоке 41
Из за неё Safari блокирует загрузку всей станицы и выполнение других скриптов на ней.
Лог консоли:
HTML:
<div id="collage" class="clear">
<a href="/raspoznavaniye-gribov/16290/668ee69f0ad038bbecd791d4c66f0459.jpg" title="480px x 640px" data-gallery="">
<img src="/raspoznavaniye-gribov/16290/668ee69f0ad038bbecd791d4c66f0459.jpg" width="480" height="640">
</a>
<a href="/raspoznavaniye-gribov/16290/89c9f637dfe608915c0b40fe0b022246.jpg" title="640px x 480px" data-gallery="">
<img src="/raspoznavaniye-gribov/16290/89c9f637dfe608915c0b40fe0b022246.jpg" width="640" height="480">
</a>
<a href="/raspoznavaniye-gribov/16290/e2da464b450dd4942d15df4d6d5dc0b2.jpg" title="640px x 480px" data-gallery="">
<img src="/raspoznavaniye-gribov/16290/e2da464b450dd4942d15df4d6d5dc0b2.jpg" width="640" height="480">
</a>
</div>
У Вас в цикле while пропущено присвоение некоторых елементов массива rows из-за ошибок в логике вызовов rowNumber++;.
А именно - пропущено присвоение элемента с индексом 1.
Бросается в глаза: rowNumber++; во внутреннем и внешнем циклах while - что вызывает перескакивание индекса rowNumber через одно значение в случае выполнения внутреннего if.
На всякий случай: команда break; в Вашем коде прерывает только один цикл - тот, в котором она непосредственно находится.
Возможно, на странице отсутствует div с id="collage"
Продвижение своими сайтами как стратегия роста и независимости