Laravel-admin: 1.5.14
Mac OS High Sierra 10.13.6
打开表单编辑页面,修改后点『保存』,在Safari浏览器中一直处于loading状态,无法成功save。
debug后
发现Nginx 日志在大约1分钟后报408 timeout超时错误。
Safari的开发者模式下看到post的地址和payload都正常
以上问题在Iphone x的Safari同样能重现
日志
xx.xx.xx.xx - - [16/Aug/2018:11:32:16 +0800] "POST /admin/posts/35286 HTTP/1.1" 408 0 "http://domain/admin/posts/35286/edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15" "-"
Safari截图
1.5.18没有这个问题
@qzd1989 更新到1.5.18重新测试了一下,问题仍然存在。
多了一点发现,当form中存在image字段时才会有问题。
如编辑用户(包含头像字段 image)
/admin/auth/users/1/edit
点保存时仍然一直loading
但编辑权限(无image字段)
/admin/auth/roles/1/edit
则可以保存成功。
通过注释源码UserController的第103行头像字段后可以证实
/**
* Make a form builder.
*
* @return Form
*/
public function form()
{
return Administrator::form(function (Form $form) {
$form->display('id', 'ID');
$form->text('username', trans('admin.username'))->rules('required');
$form->text('name', trans('admin.name'))->rules('required');
// $form->image('avatar', trans('admin.avatar'));
$form->password('password', trans('admin.password'))->rules('required|confirmed');
$form->password('password_confirmation', trans('admin.password_confirmation'))->rules('required')
->default(function ($form) {
return $form->model()->password;
});
$form->ignore(['password_confirmation']);
$form->multipleSelect('roles', trans('admin.roles'))->options(Role::all()->pluck('name', 'id'));
$form->multipleSelect('permissions', trans('admin.permissions'))->options(Permission::all()->pluck('name', 'id'));
$form->display('created_at', trans('admin.created_at'));
$form->display('updated_at', trans('admin.updated_at'));
$form->saving(function (Form $form) {
if ($form->password && $form->model()->password != $form->password) {
$form->password = bcrypt($form->password);
}
});
});
}
}
stackoverflow也有同样问题的讨论。是新版Safari浏览器的bug
https://stackoverflow.com/questions/49614091/safari-11-1-ajax-xhr-form-submission-fails-when-inputtype-file-is-empty
live demo
https://jsfiddle.net/ypresto/y6v333bq/
我也遇到了 #2085
暫時解決方法
Admin::script("$('form').attr('pjax-container', null)");
Most helpful comment
我也遇到了 #2085
暫時解決方法
Admin::script("$('form').attr('pjax-container', null)");