Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Ошибка в прикреплении файлов (https://javascript.ru/forum/dom-window/70744-oshibka-v-prikreplenii-fajjlov.html)

LADYX 29.09.2017 11:12

Ошибка в прикреплении файлов
 
Добрый день! Есть у меня вот такой скрипт прикрепления файлов в форме обратной связи. Только у него одна ошибка: если добавить файл, потом нажать на "изменить", откроется окно. И если не менять файл, а закрыть окно (ну человек передумал изменять прикрепленный файл), тогда добавленный файл сам удаляется. Помогите, пожалуйста, исправить ошибку. Спасибо!
$('.attach').each(function() { // на случай, если таких групп файлов будет больше одной
  var attach = $(this),
    fieldClass = 'attach__item', // класс поля
    attachedClass = 'attach__item--attached', // класс поля с файлом
    fields = attach.find('.' + fieldClass).length, // начальное кол-во полей
    fieldsAttached = 0; // начальное кол-во полей с файлами

  var newItem = '<div class="attach__item"><label><div class="attach__up">Добавить файл</div><input class="attach__input" type="file" name="files[]" /></label><div class="attach__name"></div><div class="attach__edit">Изменить</div><div class="attach__delete">Удалить</div></div>'; // разметка нового поля

  // При изменении инпута
  attach.on('change', '.attach__input', function(e) {
    var item = $(this).closest('.' + fieldClass),
      fileName = '';
    if (e.target.value) { // если value инпута не пустое
      fileName = e.target.value.split('\\').pop(); // оставляем только имя файла и записываем в переменную
    }
    if (fileName) { // если имя файла не пустое
      item.find('.attach__name').text(fileName); // подставляем в поле имя файла
      if (!item.hasClass(attachedClass)) { // если в поле до этого не было файла
        item.addClass(attachedClass); // отмечаем поле классом
        fieldsAttached++;
      }
      if (fields < 10 && fields == fieldsAttached) { // если полей меньше 10 и кол-во полей равно
        item.after($(newItem)); // добавляем новое поле
        fields++;
      }
    } else { // если имя файла пустое
      if (fields == fieldsAttached + 1) {
        item.remove(); // удаляем поле
        fields--;
      } else {
        item.replaceWith($(newItem)); // заменяем поле на "чистое"
      }
      fieldsAttached--;

      if (fields == 1) { // если поле осталось одно
        attach.find('.attach__up').text('Загрузить файл'); // меняем текст
      }
    }
  });

  // При нажатии на "Изменить"
  attach.on('click', '.attach__edit', function() {
    $(this).closest('.attach__item').find('.attach__input').trigger('click'); // имитируем клик на инпут
  });

  // При нажатии на "Удалить"
  attach.on('click', '.attach__delete', function() {
    var item = $(this).closest('.' + fieldClass);
    if (fields > fieldsAttached) { // если полей больше, чем загруженных файлов
      item.remove(); // удаляем поле
      fields--;
    } else { // если равно
      item.after($(newItem)); // добавляем новое поле
      item.remove(); // удаляем старое
    }
    fieldsAttached--;
    if (fields == 1) { // если поле осталось одно
      attach.find('.attach__up').text('Загрузить файл'); // меняем текст
    }
  });
});

<style>.attach__head {
  border-bottom: #000 solid 1px;
  text-transform: uppercase;
  font-weight: 700;
  padding: 0 0 5px 0px;
  margin: 0 0 5px 0;
}

.attach__item {
  border-bottom: #ccc solid 1px;
  padding: 0 0 5px 0px;
  margin: 0 0 5px 0;
}

.attach__item:last-of-type {
  margin-bottom: 0px;
  border-bottom: none;
}

.attach__up {
  cursor: pointer;
}

.attach__edit,
.attach__delete {
  display: none;
  margin-right: 10px;
  cursor: pointer;
}

.attach__edit {
  color: #2f7dfe;
}

.attach__delete {
  color: #f00;
}

.attach__item--attached .attach__up {
  display: none;
}

.attach__item--attached .attach__edit,
.attach__item--attached .attach__delete {
  display: inline-block;
}

.attach__input {
  display: none;
}</style>
<form>
  <div class="attach">
    <div class="attach__head">Прикрепите файлы (максимум 10 файлов):</div>
    <div class="attach__item">
      <label>
        <div class="attach__up">Загрузить файл</div>
        <input class="attach__input" type="file" name="files" />
      </label>
      <div class="attach__name"></div>
      <div class="attach__edit">Изменить</div>
      <div class="attach__delete">Удалить</div>
    </div>
  </div>
</form>

Dilettante_Pro 29.09.2017 12:12

LADYX,
Попробуйте в строке 13 вместо
fileName = '';

поставить
fileName = item.find('.attach__name').text();

LADYX 29.09.2017 12:30

Dilettante_Pro,
добрый день!
Если так сделать, то эта ошибка убирается. Но тогда появляется другая - сколько бы файлов не добавлял, на почту приходит только первый добавленный.

Dilettante_Pro 29.09.2017 13:31

LADYX,
Цитата:

Сообщение от LADYX
появляется другая

Появляется или и до этого была?
Каким образом вы передаете информацию по файлам к отправке почты?

LADYX 29.09.2017 13:51

Dilettante_Pro,
в скрипте только одна ошибка - та, которую я указал в своём вопросе. В остальном скрипт работает без ошибок.
Но если мы делаем так:
Цитата:

Сообщение от Dilettante_Pro (Сообщение 465973)
LADYX,
Попробуйте в строке 13 вместо
fileName = '';

поставить
fileName = item.find('.attach__name').text();

то эта ошибка исчезает. Но тогда появляется другая:
Цитата:

Сообщение от LADYX (Сообщение 465974)
сколько бы файлов не добавлял, на почту приходит только первый добавленный.


j0hnik 29.09.2017 15:48

<input class="attach__input" type="file" name="files" multiple />


multiple Позволяет выбирать и загружать сразу несколько файлов.

LADYX 29.09.2017 16:45

Цитата:

Сообщение от j0hnik (Сообщение 465999)
multiple Позволяет выбирать и загружать сразу несколько файлов.

А multiple здесь причем?


Часовой пояс GMT +3, время: 14:41.