Чтобы исправить свой код, вы можете внести следующие изменения:
var num = 1;
function readImage() {
// ...
$(".preview-image.preview-show-" + num).remove();
output.prepend(html);
// ...
}
Если вы удалите все изображения, то окажетесь в состоянии, в котором больше нет заполнителей, я не уверен, если этоявляется желательным.
Редактировать
Я нашел способ, используя ваш код, чтобы получить желаемый результат, всегда имея 3 заполнителя. Удалите все заполнители в HTML и используйте этот код JS:
var output = $(".preview-images-zone");
var num = 1;
$(document).ready(function() {
document
.getElementById("pro-image")
.addEventListener("change", readImage, false);
output.append(createNewPreview(num++));
output.append(createNewPreview(num++));
output.append(createNewPreview(num++));
output.sortable();
$(document).on("click", ".image-cancel", function() {
removePreview($(this).data("no"));
});
});
function removePreview(n) {
if (n) {
$(".preview-image.preview-show-" + n).remove();
} else if ($(".preview-image").length > 3) {
const placeholders = $(".preview-image img:not([src])");
if (placeholders.length) {
placeholders
.eq(0)
.closest(".preview-image")
.remove();
}
}
if ($(".preview-image").length < 3) {
output.append(createNewPreview(num++));
}
}
function createNewPreview(id, src) {
return $(
`<div class="preview-image preview-show-${id}">
<div class="image-cancel" data-no="${id}">x</div>
<div class="image-zone"><img id="pro-img-${id}" ${
src ? `src="${src}"` : ""
}></div>
</div>`
);
}
function readImage() {
if (window.File && window.FileList && window.FileReader) {
var files = event.target.files; //FileList object
var output = $(".preview-images-zone");
for (let i = 0; i < files.length; i++) {
var file = files[i];
if (!file.type.match("image")) continue;
var picReader = new FileReader();
picReader.addEventListener("load", function(event) {
output.prepend(createNewPreview(num, event.target.result));
num++;
removePreview();
});
picReader.readAsDataURL(file);
}
$("#pro-image").val("");
} else {
console.log("Browser not support");
}
}