Как сериализовать и отправить форму в Safari?

<form id="signinDialog" onsubmit="Signin(event)">
    <input id="sessionId" name="sessionId" value="" hidden></input>
    <input type="text" id="login" name="login" required></input>
    <input type="password" id="pass" name="pass" required></input>
    <button type="submit">Signin</button>
</form>

function Signin(event)
{
    event.preventDefault();
    LoadingStart();
    $.ajax
    ({
        type: "GET",
        url: "/signin",
        data: $("#signinDialog").serialize(),
        success: function(data, textStatus, jqXHR) {OnMessage(data)},
        error: function(jqXHR, textStatus, errorThrown) {alert(textStatus + " - " + errorThrown);},
        complete: function(jqXHR, textStatus) {LoadingStop();},
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    });
};

В chrome, firefox и IE код работает, а в Safari data = "" остаётся пустым. Как можно это решить?


Ответы (1 шт):

Автор решения: ArtGrek13

Нашел такую библиотеку https://github.com/riverside/form-serialize.

Вот моя рабочая функция сериализации:

function emulateSerialize(form)
{
    if (!form || form.nodeName !== "FORM") {return;}
    var q = [];
    for (i = form.elements.length - 1; i >= 0; i = i - 1)
    {
        if ((form.elements[i].name === "") || form.elements[i].disabled) {continue;}
        switch (form.elements[i].nodeName)
        {
            case 'INPUT':
                switch (form.elements[i].type)
                {
                    case 'text':
                    case 'hidden':
                    case 'password':
                    case 'email':
                    case 'tel':
                    case 'number':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'checkbox':
                    case 'radio':
                        if (form.elements[i].checked) {q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));}                       
                        break;
                    case 'file':
                        break;
                }
                break;           
            case 'TEXTAREA':
                q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                break;
            case 'SELECT':
                switch (form.elements[i].type)
                {
                    case 'select-one':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'select-multiple':
                        for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1)
                        {
                            if (form.elements[i].options[j].selected) {q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));}
                        }
                        break;
                }
                break;
            case 'BUTTON':
                switch (form.elements[i].type)
                {
                    case 'reset':
                    case 'submit':
                    case 'button':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                }
                break;
        }
    }
    return q.join("&");
}

Вызов emulateSerialize(document.getElementById("signinDialog"))

→ Ссылка