Получить имя изображения, щелкнув с помощью Javascript перед загрузкой

#javascript #jquery

#javascript #jquery

Вопрос:

Я загружаю изображения из одного файла ввода, но перед этим я отображаю их с помощью javascript. Я хочу добавить функцию для выбора основного изображения по щелчку. Я хочу сохранить имя выбранного изображения в скрытом вводе. Моя проблема в том, что я не могу получить исходное имя изображения, нажав на само изображение. Я нашел решение, но оно отображает имя каждого изображения. Например, я выбираю эти изображения:

 Example.jpg, Example2.png, Example3.jpg
 

Я отображаю их следующим образом:

 <div class="uploaded-image" data-index="1" id="image-1">
  <img src="blob:http://localhost/5e75ca0e-f912-461e-98a6-9f8ad302bc84">
  <button class="delete-image"><i class="iui-close"></i></button>
</div>
<div class="uploaded-image" data-index="2" id="image-2">
  <img src="blob:http://localhost/5e75ca0e-f912-461e-98a6-9f831344adc84">
  <button class="delete-image"><i class="iui-close"></i></button>
</div>
 

И когда я нажимаю на изображение-1, я хотел бы получить Example.jpg к скрытому текстовому вводу вместо большого двоичного объекта:…

Единственное решение, которое я нашел, работает с кнопкой и отображает их все. Как можно изменить его, чтобы выбрать только выбранное изображение?

Это код:

 <input type="submit" value="Show Details" onclick="FileDetails()">
 
 function FileDetails() {

    // GET THE FILE INPUT.
    var fi = document.getElementById('image-upload');

    // VALIDATE OR CHECK IF ANY FILE IS SELECTED.
    if (fi.files.length > 0) {
            console.log(fi.files);

        // RUN A LOOP TO CHECK EACH SELECTED FILE.
        for (var i = 0; i <= fi.files.length - 1; i  ) {
            fi.files[0] = document.getElementById('image-1')
            

            var fname = fi.files.item(i).name; // THE NAME OF THE FILE.
            console.log(fname);

        }
    } else {
        alert('Please select a file.')
    }
}
 

Комментарии:

1. Привет, как генерируется этот div, также показывает этот код

2. Оно генерируется этим загрузчиком изображений: github.com/christianbayer/image-uploader

Ответ №1:

Внутри вашего файла плагина уже есть событие, то есть: $container.on("click", function(e) { вы можете писать свой код там всякий image раз, когда нажимаются divs, чтобы добавить имя изображения внутри поля ввода. т.е.:

  $container.on("click", function(e) {
   var fi = $("input[type=file]")[0];
   prevent(e);
   //**get files using index (0,1,2..) add value to input..**//
    $("#imgs").val(fi.files.item($(this).data('index')).name)
 });
 

Демонстрационный код :

 (function($) {

  $.fn.imageUploader = function(options) {
    let defaults = {
      preloaded: [],
      imagesInputName: 'images',
      preloadedInputName: 'preloaded',
      label: 'Drag amp; Drop files here or click to browse',
      extensions: ['.jpg', '.jpeg', '.png', '.gif', '.svg'],
      mimes: ['image/jpeg', 'image/png', 'image/gif', 'image/svg xml'],
      maxSize: undefined,
      maxFiles: undefined,
    };
    let plugin = this;
    let dataTransfer = new DataTransfer();

    // The file input
    let $input;

    // Set empty settings
    plugin.settings = {};

    // Plugin constructor
    plugin.init = function() {

      // Define settings
      plugin.settings = $.extend(plugin.settings, defaults, options);

      // Run through the elements
      plugin.each(function(i, wrapper) {

        // Create the container
        let $container = createContainer();

        // Append the container to the wrapper
        $(wrapper).append($container);

        // Set some bindings
        $container.on("dragover", fileDragHover.bind($container));
        $container.on("dragleave", fileDragHover.bind($container));
        $container.on("drop", fileSelectHandler.bind($container));

        // If there are preloaded images
        if (plugin.settings.preloaded.length) {

          // Change style
          $container.addClass('has-files');

          // Get the upload images container
          let $uploadedContainer = $container.find('.uploaded');

          // Set preloaded images preview
          for (let i = 0; i < plugin.settings.preloaded.length; i  ) {
            $uploadedContainer.append(createImg(plugin.settings.preloaded[i].src, plugin.settings.preloaded[i].id, true));
          }

        }

      });

    };

    let createContainer = function() {

      // Create the image uploader container
      let $container = $('<div>', {
        class: 'image-uploader'
      });

      // Create the input type file and append it to the container
      $input = $('<input>', {
        type: 'file',
        id: plugin.settings.imagesInputName   '-'   random(),
        name: plugin.settings.imagesInputName   '[]',
        accept: plugin.settings.extensions.join(','),
        multiple: ''
      }).appendTo($container);

      // Create the uploaded images container and append it to the container
      let $uploadedContainer = $('<div>', {
          class: 'uploaded'
        }).appendTo($container),

        // Create the text container and append it to the container
        $textContainer = $('<div>', {
          class: 'upload-text'
        }).appendTo($container),

        // Create the icon and append it to the text container
        $i = $('<i>', {
          class: 'iui-cloud-upload'
        }).appendTo($textContainer),

        // Create the text and append it to the text container
        $span = $('<span>', {
          text: plugin.settings.label
        }).appendTo($textContainer);


      // Listen to container click and trigger input file click
      $container.on('click', function(e) {
        // Prevent browser default event and stop propagation
        prevent(e);

        // Trigger input click
        $input.trigger('click');
      });

      // Stop propagation on input click
      $input.on("click", function(e) {
        e.stopPropagation();
      });

      // Listen to input files changed
      $input.on('change', fileSelectHandler.bind($container));

      return $container;
    };


    let prevent = function(e) {
      // Prevent browser default event and stop propagation
      e.preventDefault();
      e.stopPropagation();
    };

    let createImg = function(src, id, preloaded) {

      // Create the upladed image container
      let $container = $('<div>', {
          class: 'uploaded-image'
        }),

        // Create the img tag
        $img = $('<img>', {
          src: src
        }).appendTo($container),

        // Create the delete button
        $button = $('<button>', {
          class: 'delete-image'
        }).appendTo($container),

        // Create the delete icon
        $i = $('<i>', {
          class: 'iui-close'
        }).appendTo($button);


      // If the image is preloaded
      if (preloaded) {

        // Set a identifier
        $container.attr('data-preloaded', true);

        // Create the preloaded input and append it to the container
        let $preloaded = $('<input>', {
          type: 'hidden',
          name: plugin.settings.preloadedInputName   '[]',
          value: id
        }).appendTo($container)

      } else {

        // Set the index
        $container.attr('data-index', id);

      }

      //**** on click of image...***//
      $container.on("click", function(e) {
        var fi = $("input[type=file]")[0];
        prevent(e);
        console.log($(this).data('index'))
        console.log(fi.files.item($(this).data('index')).name);
        //**get files using index (0,1,2..) add value to input..**//
        $("#imgs").val(fi.files.item($(this).data('index')).name)
      });

      // Set delete action
      $button.on("click", function(e) {

        // Prevent browser default event and stop propagation
        prevent(e);

        // Get the parent element
        let $parent = $container.parent();

        // If is not a preloaded image
        if ($container.data('preloaded') === true) {

          // Remove from preloaded array
          plugin.settings.preloaded = plugin.settings.preloaded.filter(function(p) {
            return p.id !== id;
          });

        } else {

          // Get the image index
          let index = parseInt($container.data('index'));

          // Update other indexes
          $parent.find('.uploaded-image[data-index]').each(function(i, cont) {
            if (i > index) {
              $(cont).attr('data-index', i - 1);
            }
          });

          // Remove the file from input
          dataTransfer.items.remove(index);

          // Update input files
          $input.prop('files', dataTransfer.files);
        }

        // Remove this image from the container
        $container.remove();

        // If there is no more uploaded files
        if (!$parent.children().length) {

          // Remove the 'has-files' class
          $parent.parent().removeClass('has-files');

        }

      });

      return $container;
    };

    let fileDragHover = function(e) {

      // Prevent browser default event and stop propagation
      prevent(e);

      // Change the container style
      if (e.type === "dragover") {
        $(this).addClass('drag-over');
      } else {
        $(this).removeClass('drag-over');
      }
    };

    let fileSelectHandler = function(e) {

      // Prevent browser default event and stop propagation
      prevent(e);

      // Get the jQuery element instance
      let $container = $(this);

      // Get the files as an array of files
      let files = Array.from(e.target.files || e.originalEvent.dataTransfer.files);

      // Will keep only the valid files
      let validFiles = [];

      // Run through the files
      $(files).each(function(i, file) {
        // Run the validations
        if (plugin.settings.extensions amp;amp; !validateExtension(file)) {
          return;
        }
        if (plugin.settings.mimes amp;amp; !validateMIME(file)) {
          return;
        }
        if (plugin.settings.maxSize amp;amp; !validateMaxSize(file)) {
          return;
        }
        if (plugin.settings.maxFiles amp;amp; !validateMaxFiles(validFiles.length, file)) {
          return;
        }
        validFiles.push(file);
      });

      // If there is at least one valid file
      if (validFiles.length) {
        // Change the container style
        $container.removeClass('drag-over');

        // Makes the upload
        setPreview($container, validFiles);
      } else {

        // Update input files (it is now empty due to a default browser action)
        $input.prop('files', dataTransfer.files);

      }
    };

    let validateExtension = function(file) {

      if (plugin.settings.extensions.indexOf(file.name.replace(new RegExp('^.*\.'), '.')) < 0) {
        alert(`The file "${file.name}" does not match with the accepted file extensions: "${plugin.settings.extensions.join('", "')}"`);

        return false;
      }

      return true;
    };

    let validateMIME = function(file) {

      if (plugin.settings.mimes.indexOf(file.type) < 0) {
        alert(`The file "${file.name}" does not match with the accepted mime types: "${plugin.settings.mimes.join('", "')}"`);

        return false;
      }

      return true;
    };

    let validateMaxSize = function(file) {

      if (file.size > plugin.settings.maxSize) {
        alert(`The file "${file.name}" exceeds the maximum size of ${plugin.settings.maxSize / 1024 / 1024}Mb`);

        return false;
      }

      return true;

    };

    let validateMaxFiles = function(index, file) {

      if ((index   dataTransfer.items.length   plugin.settings.preloaded.length) >= plugin.settings.maxFiles) {
        alert(`The file "${file.name}" could not be added because the limit of ${plugin.settings.maxFiles} files was reached`);

        return false;
      }

      return true;

    };

    let setPreview = function($container, files) {

      // Add the 'has-files' class
      $container.addClass('has-files');

      // Get the upload images container
      let $uploadedContainer = $container.find('.uploaded'),

        // Get the files input
        $input = $container.find('input[type="file"]');

      // Run through the files
      $(files).each(function(i, file) {

        // Add it to data transfer
        dataTransfer.items.add(file);

        // Set preview
        $uploadedContainer.append(createImg(URL.createObjectURL(file), dataTransfer.items.length - 1), false);

      });

      // Update input files
      $input.prop('files', dataTransfer.files);

    };

    // Generate a random id
    let random = function() {
      return Date.now()   Math.floor((Math.random() * 100)   1);
    };

    this.init();

    // Return the instance
    return this;
  };

}(jQuery));
$('.input-images').imageUploader(); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="imgs">
<div class="input-images"></div> 

Комментарии:

1. У меня был бы последний вопрос, если вы все еще здесь. Я бы хотел изменить класс только для выбранного изображения. Не могли бы вы показать мне, как это сделать внутри этой функции щелчка?

2. Да, вы можете использовать $(this).addClass("something") .Кроме того, не забудьте удалить class из других divs, т.е : $(".uploaded-image").removeClass("something")

3. И как я могу изменить его обратно, если пользователь нажимает на другое изображение?

4. ПРИВЕТ, вы можете просто удалить class из других divs, т.е : $(".uploaded-image").removeClass("something")