Как загрузить изображение при помощи поля "файл" (input type="file") заранее?

Как исправить функцию `loadLogo()`, чтобы она правильно обрабатывала случай, когда пользователь нажимает "отмена" и также вставляла предзагрузку изображения в DOM? И, кроме того, как изменить код JS, чтобы при клике на изображение происходил вызов `loadLogo()`?
  • 3 октября 2023 г. 13:57
Ответы на вопрос 2
Чтобы загрузить изображение с помощью поля "файл" (input type="file") заранее и вставить его в DOM, можно использовать следующий подход:

1. Добавьте элемент для отображения изображения в DOM, например, элемент с id "image-container":
```html
<div id="image-container"></div>
```

2. Создайте функцию loadLogo(), которая будет вызываться при загрузке изображения:
```javascript
function loadLogo() {
  var fileInput = document.getElementById('logo-input');
  var imageContainer = document.getElementById('image-container');

  var file = fileInput.files[0]; // Получаем выбранный файл

  // Проверяем, был ли выбран файл
  if (file) {
    var reader = new FileReader(); // Создаем объект FileReader

    reader.onload = function(e) {
      // Создаем новый элемент изображения
      var image = document.createElement('img');
      image.src = e.target.result; // Устанавливаем источник изображения

      // Очищаем элемент контейнера изображения
      imageContainer.innerHTML = '';

      // Добавляем изображение в контейнер
      imageContainer.appendChild(image);
    };

    // Читаем выбранный файл в формате Data URL
    reader.readAsDataURL(file);
  } else {
    // Если файл не выбран, очищаем элемент контейнера изображения
    imageContainer.innerHTML = '';
  }
}
```

3. Добавьте поле "файл" в HTML-разметку с id "logo-input" и добавьте обработчик события "change" для вызова функции loadLogo():
```html
<input type="file" id="logo-input" onchange="loadLogo()">
```

4. Чтобы загрузить изображение при клике на нем, добавьте обработчик события "click" для вызова функции loadLogo():
```javascript
var image = document.getElementById('image-container'); // Получаем элемент изображения

image.addEventListener('click', loadLogo);
```

Теперь, при выборе файла из поля "файл" или при клике на изображение, функция loadLogo() будет корректно обрабатывать случай, когда пользователь нажимает "отмена" и вставлять предварительную загрузку изображения в DOM.
function loadLogo(){
var div = $('#u-data #logo');
$(div).click().change(function(){
if($(this).val()){
  var input = $(this);
  var reader = new FileReader();
  reader.onload = function (){
     $('.content').find('img').attr('src', reader.result);
  }
  reader.readAsDataURL(input[0].files[0]);
}
$(div).off('change');
$(div).unbind('click');
});
}Функция loadLogo загружает логотип. При клике на элемент с идентификатором "logo" внутри элемента с идентификатором "u-data" и выборе файла, это событие временно отключается. Затем, если выбран файл, создается экземпляр FileReader, который считывает содержимое файла и при получении данных обновляет атрибут "src" найденного элемента img внутри элемента с классом "content". Далее, обработчики событий "change" и "click" у элемента с идентификатором "logo" отключаются полностью. Судя по всему, функция работает правильно.
Похожие вопросы