Объект FormData () не добавляет входные данные типа отправки из формы, в то время как в Firefox

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

Настройка

Форма на странице. При отправке данные собираются иnew FormData() объект создается с ним.

Этот объект отправляется с иxhr запрос к.php скрипт, который затем возвращаетok / error сообщение.

Код выглядит примерно так :(упрощенная версия, нет необходимости в пух)

<form name="frm" id="frm" action="" method="post" onsubmit="save(event, this);" enctype="multipart/form-data">
    <input name="name" id="name" type="text" value="..." />
    <input name="email" id="email" type="text" value="..." />
    <input name="phone" id="phone" type="text" value="..." />
    <input name="website" id="website" type="text" value="..." />
    <textarea name="details" id="details"></textarea>
    <input name="send" type="submit" value="Send" />
</form>

<script type="text/javascript">

function save(e, frm) {

        if (document.getElementById('nume').value == '' ||
          document.getElementById('email').value == '' ||
          document.getElementById('telefon').value == '' ||
          document.getElementById('site').value == '') {

            alert('Forms empty');

        } else {

            var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');

            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4) {

                    var r = JSON.parse(xhr.responseText);

                    if (r.code == 0) {
                        document.getElementById('message_ok').style.display = 'block';
                    } else {
                        document.getElementById('message_err').style.display = 'block';
                    }
                }
            };

            xhr.open('POST', 'http://url', true);
            var data = new FormData(frm);
            xhr.send(data);

        }
    e.preventDefault();
}

</script>

Отправка этого.php приведет к массиву, который выглядит примерно так:

Array
(
    [name] => some name
    [email] => some email
    [phone] => 11111111
    [website] => some site
    [details] => some details
    [send] => Send
)

а также.php ответит либо{"message":"ok","code":0} или же{"message":"error","code":1}

Теперь это ожидаемое поведение. Это то, что я получаю на Chrome, IE или Safari.

Эта проблема

Однако в Firefox я получаю тот же массив, но безsubmit вход (name="send") пара ключ / значение:

Array
(
    [name] => some name
    [email] => some email
    [phone] => 11111111
    [website] => some site
    [details] => some details
)

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

Решение

После поиска в интернете и появления пустого, я так и решил (больше исправлений, на самом деле не решая) было перезаписатьsend ключ / значение:

var data = new FormData(frm);
data.append('send', 'Send');
xhr.send(data);

Это работает, потому что, если это уже определено (Хром и т.д ...) оно перезаписывается, если его не существует, оно создается.

ВопросыАналогичный - Вы когда-нибудь сталкивались с чем-то похожим?исправлять - Я считаю, что мое решение взломано, у вас есть идеи для лучшего решения?

Ответы на вопрос(3)

Ваш ответ на вопрос