Загрузчик файлов iframe отправляется на новую вкладку - PullRequest
2 голосов
/ 16 января 2020

Я просмотрел различные другие ответы на этот точный вопрос, но я не могу решить эту проблему, и я думаю, что следовал всем советам, которые нашел там.

Я работаю над приложением vanilla JavaScript, которое должно загружать файлы через Iframe. Я создаю форму и iframe через JavaScript. Форма загрузки файла запускается с использованием JS .submit(), а для формы ее атрибут target установлен как атрибут имени и идентификатора iframe.

Несмотря на это, форма однажды открывает новое окно отправлено.

Вот как я создаю форму:

function newElement(elementType, elementID, elementClass, elementInnerText){
    let element = document.createElement(elementType);
    if(elementID != undefined){
        element.id = elementID;
    }
    if(elementClass != undefined){
        element.classList.add(elementClass);
    }
    if(elementInnerText != undefined){
        element.innerText = elementInnerText;
    }
    return element;
}

parentElement.appendChild(newElement('FORM','file-uploader','expense-details',undefined));

var fileUploadForm = formFieldWrapper.querySelector('form');
fileUploadForm.setAttribute('action', '/link/to/process.php');
fileUploadForm.setAttribute('method', 'post');
fileUploadForm.setAttribute('enctype', 'multipart/form-data');

fileUploadForm.appendChild(newElement('LABEL',undefined,'add-expense-form-field-label',undefined));
var formFieldLabel = formFieldWrapper.querySelector('label');

fileUploadForm.appendChild(newElement('INPUT',undefined,'add-expense-form-field',undefined));
var formField = formFieldWrapper.querySelector('input');
formField.setAttribute('type', 'file');
formField.setAttribute('name', 'expense_reference');

fileUploadForm.appendChild(newElement('INPUT','submit-file-upload-form',undefined,undefined));
var fileUploadSubmit = fileUploadForm.querySelector('#submit-file-upload-form');
fileUploadSubmit.setAttribute('style', 'display: none; height: 0px; width: 0px; border: 0px;');
fileUploadSubmit.setAttribute('type', 'submit');
fileUploadSubmit.setAttribute('name', 'upload-file');

var iframeWrapper = newElement('IFRAME','iframe-uploader',undefined,undefined);
fileUploadForm.appendChild(iframeWrapper);
iframeWrapper.setAttribute('id', 'iframe-uploader');
iframeWrapper.setAttribute('name', 'iframe-uploader');
iframeWrapper.setAttribute('height', '150px');
iframeWrapper.setAttribute('width', '250px');
iframeWrapper.setAttribute('frameboarder', '0');
iframeWrapper.setAttribute('scrolling', 'yes');
fileUploadForm.setAttribute('target', 'iframe-uploader');

Вот как форма отображается в HTML:

<div id="form-field-1" class="expense-details-wrapper">
  <form id="file-uploader" class="expense-details" action="/link/to/process.php" method="POST" enctype="multipart/form-data" target="iframe-uploader">
    <label class="add-expense-form-field-label">Expense Reference*</label>
    <input class="add-expense-form-field" type="file" name="expense_reference[]" placeholder="Expense Reference" required="true" multiple="false" accept=".jpg, .png, .pdf" priority="primary">
    <input id="submit-file-upload-form" style="display: none; height: 0px; width: 0px; border: 0px;"
      type="submit" name="upload-file">
    <iframe id="iframe-uploader" name="iframe-uploader" height="150px" width="250px" frameboarder="0" scrolling="yes"></iframe>
  </form>
</div>

Вот как я отправляю форму:

document.getElementById('file-uploader').submit();

Я также пробовал это:

document.getElementById('submit-file-upload-form').click();

Я не уверен, почему форма отправляется на новую вкладку. PHP, очевидно, работает нормально, потому что на новой вкладке отображаются сообщения об ошибках и успехах, как я их настроил, но он не публикует в iframe, как предполагалось.

РЕДАКТИРОВАТЬ: Пожалуйста не обращайте внимания на включенную функцию newElement. Я создал эту функцию только для ускорения процесса записи новых элементов HTML, поскольку создал каждую часть интерфейса HTML приложения с JS.

.

1 Ответ

2 голосов
/ 16 января 2020

После работы с @syedmh в чате было определено, что лучший способ go включает в себя 2 вещи:

  • Жесткое кодирование iframe в исходном коде страницы решает проблему нацеливания на frame, устраняя проблемы делегирования событий и,
  • Переключение на formData() позволит OP top извлечь выгоду из более современной технологии для загрузки файлов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...