【问题标题】:html FORMS || formdata || AJAXhtml 表格 ||表格数据 ||阿贾克斯
【发布时间】:2017-01-03 16:11:23
【问题描述】:

起点:我有一个有多种形式的网站,如下所示:

<form class="form card-content-ingredients" action="" id="form-id-0" enctype="multipart/form-data">
            <ul>
              <li class="form__item">
                <label class="form__label" for="name">Text</label>
                <input class="form__input form__input--textfield" type="text" name="description" value="" placeholder="description">
              </li>
              <li class="form__item">
                <label class="btn btn--invalid" for="file" >picture</label>
                <input class="form__input form__input--file" id="file" type="file" name="img" value="picture">
              </li>
              <ul class="form__item--multi-align-right">
                <li>
                  <input class="btn btn--invalid" type="button" value="cancel">
                </li>
                <li>
                  <input class="btn btn--invalid btn__save" type="button" value="Save" data-item-id="0" data-rqstPath="/xyz">
                </li>
              </ul>
            </ul>
          </form>

当我点击保存时,AJAX 请求会在 FormData 接口中传输所有数据,包括文件。

我的问题是:只有第一个表单元素中的文件被传输。对于所有其他表单,当我点击保存时,文件输入字段不包括在内,但是奇怪的是所有其他输入字段。当我更改表格的顺序时,它仍然具有相同的效果。 我只使用了一个处理表单数据的 JS 函数,如下所示:

function updateSettingsAJAX( itemID, rqstPath) {

        if (!(typeof itemID !== typeof undefined && itemID !== false) ||
            !(typeof rqstPath !== typeof undefined && rqstPath !== false)) {
            return false;
        }

        var formData = new FormData($('#form-id-' + itemID)[0]);


        formData.append("itemID", itemID);

        return $.ajax({
            type: "POST",
            url: rqstPath,
            data: formData,
            processData: false,
            contentType: false,
        });  

如果有人可以帮助我解决我的问题,我将不胜感激。

【问题讨论】:

  • 您在这些文件输入中是否有重复的 ID?都是file吗?
  • 谢谢@thebluefox,解决了我的问题!!
  • 我已经发布了一个答案@ArtemisUser 来结束这个问题 - 很高兴我能提供帮助:)
  • 我们这里的标题中没有“SOLVED”。如果您找到了问题的答案,请发布并接受或删除问题

标签: javascript html ajax forms form-data


【解决方案1】:

根据我在 cmets 中的建议,代表 OP 发帖;

文件&lt;input&gt; 上的重复ID 导致了一个问题,即标签的触发输入字段总是触发第一个字段。

顺便说一句 - 这是一个旧标准,但仍然值得一听 - ID's must be unique

【讨论】:

    【解决方案2】:

    这是您的代码,有一些更正(表单中的统一 ID),它工作正常: https://jsfiddle.net/sk5j8qds/

    <form class="form card-content-ingredients" action="" id="form-id-0" enctype="multipart/form-data">
    <ul>
        <li class="form__item">
            <label class="form__label">Text</label>
            <input class="form__input form__input--textfield" type="text" name="description" value="" placeholder="description">
        </li>
        <li class="form__item">
            <label class="btn btn--invalid" for="file_0" >picture</label>
            <input class="form__input form__input--file" id="file_0" type="file" name="img" value="picture">
        </li>
        <ul class="form__item--multi-align-right">
            <li>
                <input class="btn btn--invalid" type="button" value="cancel">
            </li>
            <li>
                <input class="btn btn--invalid btn__save" type="button" value="Save" data-item-id="0" data-rqstpath="/echo/html/">
            </li>
        </ul>
    </ul>
    

    <form class="form card-content-ingredients" action="" id="form-id-1" enctype="multipart/form-data">
        <ul>
            <li class="form__item">
                <label class="form__label">Text</label>
                <input class="form__input form__input--textfield" type="text" name="description" value="" placeholder="description">
            </li>
            <li class="form__item">
                <label class="btn btn--invalid" for="file_1" >picture</label>
                <input class="form__input form__input--file" id="file_1" type="file" name="img" value="picture">
            </li>
            <ul class="form__item--multi-align-right">
                <li>
                    <input class="btn btn--invalid" type="button" value="cancel">
                </li>
                <li>
                    <input class="btn btn--invalid btn__save" type="button" value="Save" data-item-id="1" data-rqstPath="/echo/html/">
                </li>
            </ul>
        </ul>
    </form>
    <script>
    function updateSettingsAJAX( itemID, rqstPath) {
            if (!(typeof itemID !== typeof undefined && itemID !== false) || !(typeof rqstPath !== typeof undefined && rqstPath !== false)) {
                return false;
            }
    
            var formData = new FormData($('#form-id-' + itemID)[0]);
    
    
            formData.append("itemID", itemID);
    
            return $.ajax({
                type: "POST",
                url: rqstPath,
                data: formData,
                processData: false,
                contentType: false,
            });
        }
    
        $(function () {
            $('.btn__save').on('click', function () {
                return updateSettingsAJAX($(this).data('item-id'),$(this).data('rqstpath') );
            });
        });
    </script>
    

    【讨论】:

    • 您应该提供有关您所做更改的更多详细信息,这将有助于@ArtemisUser 查看您的答案
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多