joh*_*hod 2 javascript safari ajax jquery
当我将表单发布到jQuery AJAX时,我突然盯着在Safari中收到400 Bad request错误.我觉得这很奇怪,因为它已经工作了2到3年了,它仍然在Firefox中运行.我不知道从哪里开始调试,有人可以帮助我吗?
submitHandler: function()
{
var formElement = document.getElementById("frmBanner");
var bannerfil = new FormData(formElement);
bannerfil.append("gruppe412", $('#gruppe412').val() );
$.ajax(
{
type: "POST",
url: "/modContent/ajax/banner-copy.php?a=frmBanner&type=45",
data: bannerfil,
dataType: "html",
processData: false,
contentType: false,
success: function(data)
{
if( data.length > 10 )
$("#content").html( data );
else
location.href="#modContent/ajax/" + data;
},
error: function (xhr, ajaxOptions, thrownError) { alert(xhr.statusText); }
});
return false;
},
// Do not change code below
errorPlacement : function(error, element) {
error.insertAfter(element.parent());
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,我在你的帖子发布后几个小时就在我的一个网站上发现了同样的问题.我同意你的观点,这必须是一个更新的问题,但我不知道哪个版本的Safari引入了这个bug.
这就是我想到的:你FormData通过将表单传递给它来构造你的对象,这应该是完美的.但似乎Safari有一个错误:当你通过传递一个带有空文件输入的表单来构造FormData对象时,请求因某种原因而中断.
解决方法:我现在正在初始化一个空的FormData对象并手动添加值,而不是var bannerfil = new FormData(formElement);初始化我的FormData.在添加文件输入之前,我检查它是否确实附加了任何文件.
formData = new FormData();
var $form = $(this); // <- change this depending on your scope/usecase
// [type="file"] will be handled separately
$form.find('input[name][type!="file"], select[name], textarea[name]').each(function(i, e) {
if ($(e).attr('type') == 'checkbox' || $(e).attr('type') == 'radio') {
if ($(e).is(':checked')) {
formData.append($(e).attr('name'), $(e).val());
}
} else {
formData.append($(e).attr('name'), $(e).val());
}
});
$form.find('input[name][type="file"]').each(function(i, e) {
if ($(e)[0].files.length > 0) {
formData.append($(e).attr('name'), $(e)[0].files[0]);
}
});
Run Code Online (Sandbox Code Playgroud)
编辑以澄清:在您的具体情况下,这样的事情应该使它工作:
submitHandler: function() {
var formElement = $("frmBanner");
var bannerfil = new FormData();
// [type="file"] will be handled separately
formElement.find('input[name][type!="file"], select[name], textarea[name]').each(function(i, e) {
if ($(e).attr('type') == 'checkbox' || $(e).attr('type') == 'radio') {
if ($(e).is(':checked')) {
bannerfil.append($(e).attr('name'), $(e).val());
}
} else {
bannerfil.append($(e).attr('name'), $(e).val());
}
});
formElement.find('input[name][type="file"]').each(function(i, e) {
if ($(e)[0].files.length > 0) {
bannerfil.append($(e).attr('name'), $(e)[0].files[0]);
}
});
bannerfil.append("gruppe412", $('#gruppe412').val() );
$.ajax({
type: "POST",
url: "/modContent/ajax/banner-copy.php?a=frmBanner&type=45",
data: bannerfil,
dataType: "html",
processData: false,
contentType: false,
success: function(data) {
if( data.length > 10 )
$("#content").html( data );
else
location.href="#modContent/ajax/" + data;
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.statusText);
}
});
return false;
},
// Do not change code below
errorPlacement : function(error, element) {
error.insertAfter(element.parent());
}
Run Code Online (Sandbox Code Playgroud)