2016-01-23 184 views
3

我正在从IE8升级到IE11。我的工作主要是解决CSS错误,但我也遇到了JavaScript的一些问题。从IE8升级到IE11时出错

在我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运行正常,它不断失败。经过调试,我发现在两个版本的IE中,data变量的值不同。

在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\">\ 

(对不起,我不能照搬全的内容,因为这将是太长了。)

据我了解,在datagetID.do产生,但是当我使用调试模式,似乎这个网页是永远ACCE ssed。

data这是什么形式?为什么两个浏览器版本有差异?

UPDATE:

使用招,我发现两个IE版本发送相同的请求的动作:

POST /src/getID.do HTTP/1.1 

在IE8,与一个JSON内容和HTTP代码的服务器响应as 200

但是在IE11中,响应的http代码是302,这是什么意思?

+0

'toFullPath()'函数返回什么? (IE11中的部分行为不同,导致它向错误的URL发出请求?) – nnnnnn

+0

@nnnnnn它将返回域,例如:当前子域为'src','toFullPath('/ getID .do')'会返回'src/getID.do',我检查了粗体IE版本,它们返回的是相同的url – NeedAnswers

+0

对不起,它会返回'/ src/getID.do' – NeedAnswers

回答

1

创建它。

这是导致问题的用户代理字符串。解决方法是修改服务器上的代码以检查IE11的用户代理字符串。

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; 
} 
+0

“以及”?这意味着你正在服务器上执行用户代理嗅探,但忽略提及任何事情? –

+0

@ErikFunkenbusch老实说,我不知道“他们”如何将'user-agent'字符串传输到服务器(一个.java文件,我只能通过运行而不是通过调试发现)来进行处理,所以我只添加了一个正则表达式以确定'用户代理'是否是IE11。 – NeedAnswers