所以我有这段代码,但我想它太重复了,有人知道我该怎么做吗?上传新图像时,我希望显示一个新图像框。我的解决方案有效,但是如果我想拥有1000张新图像怎么办?我不能一次只输入一个。我该怎么做才能优化这个问题?
HTML:
<div class="wrapper">
<div class="box box_image" id="box_image_1">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image1" data-show='box_image_2' name="IgniteFormObject.Image1" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_2">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image2" data-show='box_image_3' name="IgniteFormObject.Image2" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_3">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image3" data-show='box_image_4' name="IgniteFormObject.Image3" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_4">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image4" data-show='box_image_5' name="IgniteFormObject.Image4" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_5">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image5" name="IgniteFormObject.Image5" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
</div>
Javascript:
上传图片时,将调用此JQuery。
$('#image1').change(function (ev) {
$("#box_image_2").show();
});
$('#image2').change(function (ev) {
$("#box_image_3").show();
});
$('#image3').change(function (ev) {
$("#box_image_4").show();
});
$('#image4').change(function (ev) {
$("#box_image_5").show();
});
答案 0 :(得分:3)
您可以使用data
属性和多个选择器。在data属性中,传递要显示的元素的id
并进行更改,以获取该属性
$('#image1,#image2,#image3,#image4').on('change', function(ev) {
let toShow = $(this).data('show');
console.log(toShow);
// $('#'+toShow).show();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id='image1' type='checkbox' data-show='box_image_2'>
<input id='image2' type='checkbox' data-show='box_image_3'>
<input id='image3' type='checkbox' data-show='box_image_4'>
<input id='image4' type='checkbox' data-show='box_image_5'>
您还可以使用通配符选择器,其中id
以image
开头
$('input[id^="image"]').on('change', function(ev) {
let toShow = $(this).data('show');
console.log(toShow);
// $('#'+toShow).show();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id='image1' type='checkbox' data-show='box_image_2'>
<input id='image2' type='checkbox' data-show='box_image_3'>
<input id='image3' type='checkbox' data-show='box_image_4'>
<input id='image4' type='checkbox' data-show='box_image_5'>
答案 1 :(得分:1)
您可以使用for循环尝试这种方法。
for
循环change
中将功能设置为image${i}
。change
上的show()
函数调用box_image_${i+1}
内我也在代码中使用了Template Literals
for(let i = 1;i<=4;i++){
$(`#image${i}`).change(function (ev) {
$(`#box_image_${i+1}`).show();
})
}
答案 2 :(得分:1)
您可以简单地使用如下类:
$('.image').change(function (ev) {
$(this).next(".box_image").show();
});
答案 3 :(得分:0)
将其粘在一个循环中吗?
for(var i = 1; i <= 4; i++){
$('#image'+i).change(function (ev) {
$("#box_image_"+(i+1)).show();
});
}
答案 4 :(得分:0)
严格根据您的标记以及每个元素的唯一ID ...
关键是从父容器中撤回id
,并递增一个以显示下一个。
// Hide all containers except the first, on load (possibly already achieved via CSS)
$("[id^='box_image_']").not(":first").hide();
// Change handler
$("[id^='image']").change(function(ev) {
// Retreive the index part of the container's id
var parent_box_image_id = $(this).closest("[id^='box_image_']").attr("id").split("box_image_")[1];
console.log(parent_box_image_id);
// Increment by one
parent_box_image_id++;
// Show the next one!
$("#box_image_"+parent_box_image_id).show();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrapper">
<div class="box box_image" id="box_image_1">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image1" data-show='box_image_2' name="IgniteFormObject.Image1" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_2">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image2" data-show='box_image_3' name="IgniteFormObject.Image2" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_3">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image3" data-show='box_image_4' name="IgniteFormObject.Image3" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_4">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image4" data-show='box_image_5' name="IgniteFormObject.Image4" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" id="box_image_5">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" id="image5" name="IgniteFormObject.Image5" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
</div>
但是还有另一种方式,可以更有效地完成此操作……就像直接忘记id并使用类一样……请看下面的另一个代码段。 ;)
// Hide all containers except the first, on load (possibly already achieved via CSS)
$(".box_image").not(":first").hide();
// Change handler
$(".image-upload").change(function(ev) {
$(this).closest(".box_image").next().show();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrapper">
<div class="box box_image" class="box_image">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" name="IgniteFormObject[]" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" class="box_image">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" name="IgniteFormObject[]" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" class="box_image">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" name="IgniteFormObject[]" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" class="box_image">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" name="IgniteFormObject[]" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
<div class="box box_image" class="box_image">
<div class="js--image-preview"></div>
<div class="upload-options">
<label>
<input type="file" class="image-upload" name="IgniteFormObject[]" accept="image/*" enctype="multipart/form-data" />
</label>
</div>
</div>
</div>