Как сериализовать и отправить форму в 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"))