Использование $(this) с FileReader() для целевого результата
Я пытаюсь показать предварительный просмотр ajax изображения из файла ввода. Достаточно легко использовать FileReader (), но я использую его с циклом, поэтому, когда пришло время поместить результат в Источник изображения, мне нужно использовать $(this), чтобы нацелить элемент цикла ввода. Это даже не имеет смысла для меня, так что мы идем.
У нас есть цикл..
<li>
<input type="file" class="image" />
<img src="" class="preview" />
</li>
<li>
<input type="file" class="image" />
<img src="" class="preview" />
</li>
<li>
<input type="file" class="image" />
<img src="" class="preview" />
</li>
Итак, теперь давайте скажем, что второй вход выбран, и теперь мне нужно добавить результат из FileReader к его изображению src. Как я нацеливаюсь на второго элемент цикла и его содержание, чтобы делать вещи?
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
// Here I need to use $(this) to target only the second list item's img.preview
$('.preview').attr('src', e.target.result);
};
reader.readAsDataURL(input.files[0]);
}
}
2 ответа:
Я никогда раньше не работал с этим API. Интересная вещь.
Эта версия перебирает все входные файлы и загружает их изображения предварительного просмотра. Функция запускается нажатием кнопки.
$(function(){ $("#btnLoadPreviews").click(loadPreviews_click); }) function loadPreviews_click(e) { $(".image").each(function() { var $input = $(this); var inputFiles = this.files; if(inputFiles == undefined || inputFiles.length == 0) return; var inputFile = inputFiles[0]; var reader = new FileReader(); reader.onload = function(event) { $input.next().attr("src", event.target.result); }; reader.onerror = function(event) { alert("I AM ERROR: " + event.target.error.code); }; reader.readAsDataURL(inputFile); }); }
Если вы предпочитаете, чтобы изображение предварительного просмотра загружалось по мере их выбора, вы можете использовать эту версию.
$(function(){ $(".image").change(showPreviewImage_click); }) function showPreviewImage_click(e) { var $input = $(this); var inputFiles = this.files; if(inputFiles == undefined || inputFiles.length == 0) return; var inputFile = inputFiles[0]; var reader = new FileReader(); reader.onload = function(event) { $input.next().attr("src", event.target.result); }; reader.onerror = function(event) { alert("I AM ERROR: " + event.target.error.code); }; reader.readAsDataURL(inputFile); }
Это как я бы сделал это. Назначьте цель самому объекту чтения и используйте его позже.
function readURL(input) { if (input.files && input.files[0]) { var reader = new FileReader(); // set where you want to attach the preview reader.target_elem = $(input).parent().find('preview'); reader.onload = function (e) { // Attach the preview $(reader.target_elem).attr('src', e.target.result); }; reader.readAsDataURL(input.files[0]); } }