Chrome-Synchronous-XHR-in-page-dismissal

简介

有个老应用,为了兼容 Safa,IE,Chrome 做了坏味道的处理
AJAX => Popup => PopupClose => AJAX
结果今天最新版的 Chrome 出错,其他浏览器正常。
错误:Synchronous XHR in page dismissal

原因是 Window.close 后,同步调用了 AJAX

伪码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  Ajax({
type:"POST",
url : XXX.XXX.XXXXXXXdata,
data:JSON.stringify(makeInsertCondJSON(XXXXXSeikyuFile, XXXXXSeikyuDetail)),
//async:false,
success:function(data) {
if(data.success) {
// 確認画面表示
popWindowWSizeKey(commUrl.XXXX.XXXXXPreview, "XXXX_preview", function() {
// previewでOKが押されたら登録処理
var storageInfo = JSON.parse(localStorage.getItem(storageKeyIn.seikyushoPreview));
if( storageInfo == null || storageInfo === undefined ) {
// 情報が無い場合はキャンセルされたものとする
// ※windowsの閉じるボタンで閉じた場合はlocalstorageが保存されない
return ;
} else {
if(storageInfo.isConfirmed == true) {
// 更新処理実行
update();
}
}
});
} else {
cm.showErrMsg(data.message);
}
},
error:function() {}
});


/**
* 更新処理
*/
function update() {
// ↓↓↓ 出错
var result= XXX.serv.getData_doki(crtParamUrl(commUrl.XXXX.checkXXXXXiIdVer, "id",dbInfo.id), reqType.GET, {});
var result = null;
f(!result){
//エラーMsgは getData_dokiで表示済
return;
}
dosomething();
}

尝试在服务器端(JAVA)加入下列代码 无效

1
res.setHeader("Feature-Policy", "sync-xhr 'self'"); // Chrome 83 尝试

主要问题所在

在 AJAX 的回调里 Popup 一个 Window,并在 Window.close()以后调用了同步 Ajax。
把同步 Ajax 改为异步,问题解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 更新処理
*/
function update() {
// ↓↓↓ 修改
XXX.serv.getData_hidoki(
crtParamUrl(commUrl.XXXX.checkXXXXXiIdVer, "id",dbInfo.id)
, reqType.GET, {},function(result){
f(!result){
//エラーMsgは getData_dokiで表示済
return;
}
dosomething();
});
}