从 IE8 升级到 IE11 时出错
Error when upgrading from IE8 to IE11
我正在进行从 IE8 到 IE11 的迁移项目。我的工作主要是修复 CSS 错误,但我也遇到了 JavaScript.
的一些问题
在我的 master.jsp
页面中,我有这个 JavaScript:
<script type="text/javascript">
$(function() {
$.ajax({
url: toFullPath('/getID.do')
,type: "POST"
,cache: false
,dataType: "text"
,success: function(data) {
var jsonData = null;
try {
jsonData = jQuery.secureEvalJSON(data);
} catch(e) {
setTimeout(function() {
alert('Failed to start.');
}, 10);
return;
}
$.appconf.systemId = jsonData.systemId;
setTimeout(function() {
startSystem(document.forms['startForm'], toFullPath('/showLoginPageAction.do'));
}, 10);
}
});
});
</script>
此脚本运行在 IE8、IE9、IE10 中都很好
当此脚本在 IE11 中为 运行 时,它一直失败。调试后发现data
变量的值在两个版本的IE中是不一样的。
在 IE8 中是有效的 JSON:
"
{"ID":"001","system_changes":{}}
"
但在IE11中,母版页的内容显示为:
"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\" />\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\r\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\r\n<meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\">\
(对不起,我不能复制完整的内容,因为它太长了。)
据我了解,data
将由 getID.do
生成,但是当我使用调试模式时,似乎从未访问过此页面。
这个 data
形式在哪里?为什么两个浏览器版本有差异?
更新:
使用 Fiddler,我发现两个 IE 版本向操作发送相同的请求:
POST /src/getID.do HTTP/1.1
在 IE8 中,服务器响应 Json 内容和 http 代码为 200
但是在IE11中,响应的http代码是302,这是什么意思?
找到了。
导致问题的是 user-agent 字符串。解决方案是修改服务器上的代码以检查 IE11 的 user-agent 字符串。
public boolean isValidIE(String strAgent) {
if (1==1){
return true;
}
Pattern pattern = Pattern.compile(".*\sMSIE\s(\d{1,}\.\d{1,})[^;]*;.*");
Matcher match = pattern.matcher(strAgent);
if(!match.matches()) {
Pattern patternIE11 = Pattern.compile(".*Trident.*rv:.*");
Matcher matcherIE11 = patternIE11.matcher(strAgent);
if(matcherIE11.matches()){
return true;
}
return false;
}
String ver = match.group(1);
float version = Float.parseFloat(ver);
if(version >= 8) {
return true;
}
return false;
}
我正在进行从 IE8 到 IE11 的迁移项目。我的工作主要是修复 CSS 错误,但我也遇到了 JavaScript.
的一些问题在我的 master.jsp
页面中,我有这个 JavaScript:
<script type="text/javascript">
$(function() {
$.ajax({
url: toFullPath('/getID.do')
,type: "POST"
,cache: false
,dataType: "text"
,success: function(data) {
var jsonData = null;
try {
jsonData = jQuery.secureEvalJSON(data);
} catch(e) {
setTimeout(function() {
alert('Failed to start.');
}, 10);
return;
}
$.appconf.systemId = jsonData.systemId;
setTimeout(function() {
startSystem(document.forms['startForm'], toFullPath('/showLoginPageAction.do'));
}, 10);
}
});
});
</script>
此脚本运行在 IE8、IE9、IE10 中都很好
当此脚本在 IE11 中为 运行 时,它一直失败。调试后发现data
变量的值在两个版本的IE中是不一样的。
在 IE8 中是有效的 JSON:
"
{"ID":"001","system_changes":{}}
"
但在IE11中,母版页的内容显示为:
"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\" />\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\r\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\r\n<meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\">\
(对不起,我不能复制完整的内容,因为它太长了。)
据我了解,data
将由 getID.do
生成,但是当我使用调试模式时,似乎从未访问过此页面。
这个 data
形式在哪里?为什么两个浏览器版本有差异?
更新:
使用 Fiddler,我发现两个 IE 版本向操作发送相同的请求:
POST /src/getID.do HTTP/1.1
在 IE8 中,服务器响应 Json 内容和 http 代码为 200
但是在IE11中,响应的http代码是302,这是什么意思?
找到了。
导致问题的是 user-agent 字符串。解决方案是修改服务器上的代码以检查 IE11 的 user-agent 字符串。
public boolean isValidIE(String strAgent) {
if (1==1){
return true;
}
Pattern pattern = Pattern.compile(".*\sMSIE\s(\d{1,}\.\d{1,})[^;]*;.*");
Matcher match = pattern.matcher(strAgent);
if(!match.matches()) {
Pattern patternIE11 = Pattern.compile(".*Trident.*rv:.*");
Matcher matcherIE11 = patternIE11.matcher(strAgent);
if(matcherIE11.matches()){
return true;
}
return false;
}
String ver = match.group(1);
float version = Float.parseFloat(ver);
if(version >= 8) {
return true;
}
return false;
}