Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Проблема с imagesPreview (https://javascript.ru/forum/library-toolkit-framework/70488-problema-s-imagespreview.html)

deatlink 08.09.2017 18:25

Проблема с imagesPreview
 
Здравствуйте, не могу понять почему когда я загружаю к примеру 3 картинки (через Multiple), то в превью они отображаются не по порядку как я выбрал. Т.е. 2,1,3

Как можно сделать чтобы отображались по порядку то что я выбрал через CTR ? (1,2,3)

$(function() {

    var imagesPreview = function(input, placeToInsertImagePreview) {
	
        if (input.files) {
            var filesAmount = input.files.length;

            for (i = 0; i < filesAmount; i++) {
                var reader = new FileReader();

                reader.onload = function(event) {
			var hrava = Math.random();
                    $($.parseHTML('........')).attr('src', event.target.result).appendTo(placeToInsertImagePreview);

                }
    reader.readAsDataURL(input.files[i]);
            }
        }

    };

    $('#gallery-photo-add').on('change', function() {
        imagesPreview(this, 'div.gallery');
    });
});

рони 08.09.2017 18:54

deatlink,
onload -- работает асинхронно -- когда картинка загрузится

deatlink 08.09.2017 19:03

хотя я вижу что если через CTR выбираю первую, потом вторую, то мною выбранная вторая получается первой...

deatlink 08.09.2017 19:06

т.е выбираю через ctr la.png, ka.png, ca.png

то в строке

"ca.png" "ka.png" "la.png"

по этому мною выбранную первую la.png отображает последней.

Можно как то вывести с конца? т.е. первую мною выбранную

рони 08.09.2017 19:16

deatlink,
:-?

deatlink 08.09.2017 19:22

понял что вы написали, onload отобразит картинки которые загрузились. Как сделать чтобы отобразить результат после того как все картинки загрузились?

рони 08.09.2017 19:55

deatlink,
в onload заполнять массив картинками и проверять его длину если arr.length== numer то ...

deatlink 08.09.2017 19:57

я в этом очень слаб, не могли бы помочь это сделать? :)

рони 08.09.2017 22:53

просмотр загружаемых картинок
 
deatlink,

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css"> .gallery img{
    height: 100px;
    width: auto;
  }

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var imagesPreview = function(input, placeToInsertImagePreview) {
        var count = 0;
        var arr = [].map.call(input.files, function(src, i) {
            count = i + 1;
            var reader = new FileReader;
            reader.onload = function(event) {
                arr[i] = event.target.result;
                count--;
                if (!count) arr.forEach(function(src) {
                    $("<img>", {
                        src: src
                    }).prependTo(placeToInsertImagePreview)
                })
            };
            reader.readAsDataURL(src);
            return reader
        })
    };
    $("#gallery-photo-add").on("change", function() {
        imagesPreview(this, "div.gallery")
    })
});
  </script>
</head>

<body>
<div class="gallery"></div>
<input id="gallery-photo-add" name="" type="file" multiple="">
</body>
</html>

deatlink 08.09.2017 23:58

когда выбираю в окне первый файл, а потом другие то первый в конец выводится(

рони 09.09.2017 00:08

deatlink,
похоже порядок зависит только от имени файла.

рони 09.09.2017 00:19

deatlink,
может appendTo заменить на prependTo, больше пока мыслей нет, смотрите код выше.

deatlink 09.09.2017 00:56

спс помогло

deatlink 09.09.2017 01:05

только если я дополняю

$($.parseHTML('<br><br><img style="width:200px; margin:0 10px;float: left;"><input style="width:300px;height: 23px;" name="imgtitle[]" type="text" placeholder="тайтл" /><input style="width:300px;height: 23px;" name="imgalt[]" type="text" placeholder="альт" /><br><div style="clear:both;"></div>')).prependTo(placeToInsertImagePreview);

то при отправке POST он почему то вставляет значение для нижнего (последнего фото) т.е. не для него выводяся поля доп input...

рони 09.09.2017 01:10

Цитата:

Сообщение от deatlink
только если я дополняю

не понимаю, не могу помочь

deatlink 09.09.2017 01:13

У вас есть скайп? или ICQ? напишите в личку, очень нужна помощь... по этому поводу... буду благодарен...

рони 09.09.2017 01:22

deatlink,
может вы так хотите?
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css"> .gallery img{
    height: 100px;
    width: auto;
  }

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var imagesPreview = function(input, placeToInsertImagePreview) {
        var count = 0;
        var arr = [].map.call(input.files, function(src, i) {
            count = i + 1;
            var reader = new FileReader;
            reader.onload = function(event) {
                arr[i] = event.target.result;
                count--;
                if (!count) arr.forEach(function(src) {

                $($.parseHTML('<br><br><img style="width:200px; margin:0 10px;float: left;" src="'+src+'"><input style="width:300px;height: 23px;" name="imgtitle[]" type="text" placeholder="тайтл" /><input style="width:300px;height: 23px;" name="imgalt[]" type="text" placeholder="альт" /><br><div style="clear:both;"></div>')).prependTo(placeToInsertImagePreview);
                   /* $("<img>", {
                        src: src
                    }).prependTo(placeToInsertImagePreview)*/
                })
            };
            reader.readAsDataURL(src);
            return reader
        })
    };
    $("#gallery-photo-add").on("change", function() {
        imagesPreview(this, "div.gallery")
    })
});
  </script>
</head>

<body>
<div class="gallery"></div>
<input id="gallery-photo-add" name="" type="file" multiple="">
</body>
</html>

deatlink 09.09.2017 10:12

Да, но почему-то если я загружаю 3 картинки и заполняю эти два инпута первому, то после сохранении (заливки в базу) он применяет к последней

рони 09.09.2017 10:23

deatlink,
вам наверно нужен, специалист по серверу

deatlink 09.09.2017 10:34

Вы думаете эта проблема уже в php?

рони 09.09.2017 11:05

Цитата:

Сообщение от deatlink
Вы думаете эта проблема уже в php?

надо либо на клиенте менять порядок в input.files(если возможно), либо на сервере

рони 09.09.2017 11:06

deatlink,
или вводить скрытое поле для src

deatlink 09.09.2017 11:08

Цитата:

Сообщение от рони (Сообщение 464158)
надо либо на клиенте менять порядок в input.files(если возможно), либо на сервере

Да тоже подумал насчет смены порядка input.files, только как это сделать?)

рони 09.09.2017 11:18

deatlink,
счас...

рони 09.09.2017 11:45

deatlink,
увы, не знаю как сохранить порядок выбора фото...
но чтоб описание и фото совпадали, нельзя менять appendTo.
вариант ниже
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css"> .gallery img{
    height: 100px;
    width: auto;
  }

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var imagesPreview = function(input, placeToInsertImagePreview) {
        var count = 0;
        var arr = [].map.call(input.files, function(file) {return file});
        arr.forEach(function(file,i) {
            count = i + 1;
            var reader = new FileReader;
            reader.onload = function(event) {
                arr[i] = event.target.result;
                count--;
                if (!count) arr.forEach(function(src) {

                $($.parseHTML('<br><br><img style="width:200px; margin:0 10px;float: left;" src="'+src+'"><input style="width:300px;height: 23px;" name="imgtitle[]" type="text" placeholder="тайтл" /><input style="width:300px;height: 23px;" name="imgalt[]" type="text" placeholder="альт" /><br><div style="clear:both;"></div>')).appendTo(placeToInsertImagePreview);

                })
            };
            reader.readAsDataURL(file);

        })

    };
    $("#gallery-photo-add").on("change", function() {
        imagesPreview(this, "div.gallery")
    })
});
  </script>
</head>

<body>
<div class="gallery"></div>
<input id="gallery-photo-add" name="" type="file" multiple="">
</body>
</html>

deatlink 09.09.2017 11:47

=(

deatlink 09.09.2017 11:47

а если как то описание вывести тоже через prependTo ?

рони 09.09.2017 11:49

deatlink,
смена порядка ничего не дала, внутри порядок идёт по алфавиту, а не по тому как добавили (возможно я что-то упускаю, но больше мыслей нет)

deatlink 09.09.2017 11:51

да тоже такое ощущение)

deatlink 09.09.2017 11:53

а что если эти два input взять в div и присвоить им ID

к примеру если загружаем 3 фото то будут 1, 2, 3 и вывести с конца Т.е. 3, 2 , 1...

Можно так?

рони 09.09.2017 11:58

deatlink,
нельзя!!! всё зависит от имени файла, если имена именно такие 1, 2, 3 то вариант ниже.
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css"> .gallery img{
    height: 100px;
    width: auto;
  }

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var imagesPreview = function(input, placeToInsertImagePreview) {
        var count = 0;
        var arr = [].map.call(input.files, function(file) {return file})
        arr.reverse();
        arr.forEach(function(file,i) {
            input.files[i] = file;
            count = i + 1;
            var reader = new FileReader;
            reader.onload = function(event) {
                arr[i] = event.target.result;
                count--;
                if (!count) arr.forEach(function(src) {

                $($.parseHTML('<br><br><img style="width:200px; margin:0 10px;float: left;" src="'+src+'"><input style="width:300px;height: 23px;" name="imgtitle[]" type="text" placeholder="тайтл" /><input style="width:300px;height: 23px;" name="imgalt[]" type="text" placeholder="альт" /><br><div style="clear:both;"></div>')).appendTo(placeToInsertImagePreview);

                })
            };
            reader.readAsDataURL(file);

        })

    };
    $("#gallery-photo-add").on("change", function() {
        imagesPreview(this, "div.gallery")
    })
});
  </script>
</head>

<body>
<div class="gallery"></div>
<input id="gallery-photo-add" name="" type="file" multiple="">
</body>
</html>

deatlink 09.09.2017 12:01

мда... с полями беда(


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