Поскольку мануалы по чистому js ещё не курил, то возникли сложности. Делаю загрузку фоток средствами HTML5 File API. С выводом миниатюр и предвалительным удалением "лишних" фото. Разметка: Код (PHP): <div id="wrap"> <input type="file" id="fileInput" multiple accept="image/*" style="display:none" onchange="handleFiles(this.files)"> <div id="fileSelect">Щелкните здесь, либо перетащите сюда файлы.</div> <button onclick="onclickUpload()">Загрузить</button> <div id="fileOutput"></div> </div> Вот собственно сама функция обработки выбранных файлов и вывода миниатюр: Код (PHP): function handleFiles(files) { // в функцию передаются файлы как выбранные через выбор файлов, так и при перетаскивании var listFiles = files; for(i=0; i<listFiles.length; i++){ if (listFiles[i].type == 'image/jpeg' || listFiles[i].type == 'image/png'){ filesArray = filesArray.concat(listFiles[i]); // Собираю все выбранные файлы в один массив. } } var oldThumb = document.querySelectorAll(".thumb"); if(oldThumb.length != 0) { document.getElementById('fileOutput').innerHTML = ''; // Если миниатюры уже есть, я их удаляю, чтобы заново их вывести вместе с ещё выбранными. } for(i=0; i<filesArray.length; i++){ var reader = new FileReader(); reader.onload = (function(theFile) { return function(event) { var span = document.createElement('span'); span.innerHTML = ['<div class="del"></div><img class="thumb" data-item="',i,'" src="', event.target.result,'"/>'].join(''); document.getElementById('fileOutput').insertBefore(span, null); }; })(filesArray[i]); reader.readAsDataURL(filesArray[i]); } } Вывод миниатюр работает почти как надо, за исключением того, что в массиве filesArray они сортируются по имени выбранного файла. И потом при выводи миниатюр встают не в том порядке, в котором я их выбираю. Побороться с этим не получается. И ещё момент, пока не реализованный. Как организовать удаление элемента массива по нажатию на блок <div class="del"></div>. Скорее даже вопрос в другом, как определить, что я удаляю нужный элемент. Думал в цикле data-item присваивать порядковый номер. По нему определять по какой картинке щелкнул, но и тут возникла проблема, в data-item попадает последнее значение i, хотя всё вроде в цикле. Хотелось бы комментариев, конструктивной критики и советов по скрипту.
Особенность оптимизации массивов в JS - они автосортирующиеся. Доверяться им в плане порядка ввода нельзя ни в коем случае. Мало того, что они самосортируются, так еще и сама сортировка зависит от браузера и, соответственно, его JS-движка. Исключение - если фигачить строго индексы от 0 и далее. То есть, уже в порядке сортировки. Но тогда можно забыть об произвольных ключах и юзании хэштаблиц. Но это разруливается за счет использования двух массивов. Первый массив хранит любо удобный тебе ключ и ссылку на хранимый объект. Второй массив хранит строго числовые индексы в качестве ключа, в то время, как в качестве значения у него ключи из первого массива. Таким образом, первый массив реализует само хранение данных, а второй отвечает за их порядок. в итоге, при проходе через for и выборке arr1[arr2], ты будешь получать элементы arr1 в правильном порядке. Самому пришлось об это головой удариться, когда понял, что нельзя просто взять и собрать Z-Buffer для спрайтового движка из одного массива. Это, конечно, если не нужен доступ по строковым ключам.. Добавлено спустя 4 минуты 46 секунд: array.splice array.slice Функции для вставки и коррекции массивов в JS. Если делать без них, руками, то будет боль. Напиши в самом начале скрипта, до всего кода строчку Код (Text): "use strict"; Как есть, с кавычками. Это и будет тебе критикой, когда все работать перестанет резко. А оно перестанет, я гарантирую это.