Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Непреклонные изображения (https://javascript.ru/forum/events/63168-nepreklonnye-izobrazheniya.html)

Bac9_AJlkaLLl 21.05.2016 20:30

Непреклонные изображения
 
Доброго времени суток форумчане. Вопрос состоит в следующем. Создается массив изображений, который мне необходимо пихнуть на страницу, но перед тем как пихнуть, надо забрать у них стартовые значения высоты и ширины. Все мои попытки увенчались провалом, ибо он выводит либо "" или же 0.
naturalHeight/naturalWidth, height/width, style.height/style/width - все, что знаю перепробовал :D
Так вот, и кусочек кода, отвечающий за сие действо.
var quantity = 15,
    images = [];
    imageDimensions = [];


function fillArray() {
    for (var i = 1; i <= quantity; i++) {
        var Picture = document.createElement('img');
            Picture.setAttribute('src', 'image/prod/' + i + '.jpg');

        images.push(Picture);

        var startHeight = Picture.height;
        var startWidth = Picture.width;

        imageDimensions.push({width: startWidth, height: startHeight});
    }
}

function initProd() {
    fillArray();
    console.log(images);
    console.log(imageDimensions);
}


Помогите, кто чем может, а то уже вторую неделю ничего с этим поделать не могу :cray: .

рони 21.05.2016 20:45

Bac9_AJlkaLLl,
Picture.onload => imageDimensions[i]({width: startWidth, height: startHeight});

рони 21.05.2016 21:00

Bac9_AJlkaLLl,
var quantity = n =15,
    images = [],
imageDimensions = [];

function fillArray() {
    for (var i = 1; i <= quantity; i++) {
        var Picture = new Image;
        images.push(Picture);
        Picture.onload = function(a) {
            return function() {
                imageDimensions[a]({
                    width: this.width,
                    height: this.height
                });
                if (!--n) initProd()
            }
        }(i);
        Picture.src = "image/prod/" + i + ".jpg"
    }
}
fillArray();

function initProd() {
    console.log(images);
    console.log(imageDimensions)
};

Bac9_AJlkaLLl 21.05.2016 22:21

Чуть подкоректировать заполнение второго массива и все работает. Ура! спасибо огромное.:dance:
Забыл совсем про замыкания, не любил их никогда :D
В прежней версии, пытался через онлоэд, но к успеху не привело.

Bac9_AJlkaLLl 22.05.2016 15:22

рони,
Нашел такую ошибку, что он вываливает не по порядку. Нашел похожий пост, в котором ты же и говоришь, что это хром пытается все оптимизировать и дело в скорости обработки, что-то такое, точно не помню...
так вот я теперь не совсем понимаю как исправить это.
function fillArray() {
    for (var i = 1; i <= quantity; i++) {
        var Picture = new Image;
        images.push(Picture);

        Picture.onload = (function (count) {
            return function () {
                console.log(count);
                imageDimensions.push({
                    width: this.naturalWidth,
                    height: this.naturalHeight
                });
            }
        })(i);

        Picture.src = "image/prod/" + i + ".jpg";
    }
}
fillArray();

рони 22.05.2016 16:10

Bac9_AJlkaLLl,
function fillArray() {
    for (var i = 1; i <= quantity; i++) {
        var Picture = new Image;
        images.push(Picture);

        Picture.onload = (function (count) {
            return function () {
                console.log(count);
                imageDimensions[count]({
                    width: this.naturalWidth,
                    height: this.naturalHeight
                });
            }
        })(i - 1);

        Picture.src = "image/prod/" + i + ".jpg";
    }
}
fillArray();

Bac9_AJlkaLLl 22.05.2016 18:51

Вложений: 1
Собственно вот, какие каунты он выводит в данном случае, в предыдущей было практически тоже самое.:(

рони 22.05.2016 19:31

Bac9_AJlkaLLl,
и какая проблема то? вам же написали решение ещё в 3 посте, нужно было только -1 добавить.
var quantity = n =15,
    images = [],
imageDimensions = [];

function fillArray() {
    for (var i = 1; i <= quantity; i++) {
        var Picture = new Image;
        images.push(Picture);
        Picture.onload = function(a) {
            return function() {
                imageDimensions[a]({
                    width: this.naturalWidth,
                    height: this.naturalHeight
                });
                if (!--n) initProd()
            }
        }(i - 1);
        Picture.src = "image/prod/" + i + ".jpg"
    }
}
fillArray();

function initProd() {  // тут делайте что хотите с готовыми массивами
    console.log(images);
    console.log(imageDimensions)
};


Часовой пояс GMT +3, время: 12:47.