Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript可靠地检测IE8_Javascript_Internet Explorer_Internet Explorer 8 - Fatal编程技术网

使用javascript可靠地检测IE8

使用javascript可靠地检测IE8,javascript,internet-explorer,internet-explorer-8,Javascript,Internet Explorer,Internet Explorer 8,我已经编写了一个需要IE版本8(或更高版本)的web应用程序。如果我在虚拟机上的干净windows安装上运行IE8,当使用javascript中的navigator.userAgent进行查询时,它会将“MSIE 8.0”报告为用户代理。但是在一台同事的Windows7机器上,他的IE在“帮助|关于”窗口中报告了版本8,但用户代理字符串是“MSIE7.0” 我想在他的机器上的某个地方有一个设置,告诉IE欺骗以前的版本,我猜是某种兼容性设置,但就我个人而言,我找不到它。我没有从我的终端设置quir

我已经编写了一个需要IE版本8(或更高版本)的web应用程序。如果我在虚拟机上的干净windows安装上运行IE8,当使用javascript中的navigator.userAgent进行查询时,它会将“MSIE 8.0”报告为用户代理。但是在一台同事的Windows7机器上,他的IE在“帮助|关于”窗口中报告了版本8,但用户代理字符串是“MSIE7.0”


我想在他的机器上的某个地方有一个设置,告诉IE欺骗以前的版本,我猜是某种兼容性设置,但就我个人而言,我找不到它。我没有从我的终端设置quirksmode或IE7兼容模式。

用户代理不是确定浏览器版本的明智或可靠的方法。 你为什么不把它设为IE8并使用它来寻找你所需要的功能呢? 这是一种更可靠的方法。


它应该发现这些问题。或者,我不确定,但IE 8可能会在“兼容模式”下切换其用户代理标记。

您可以使用条件注释吗

<script>
  var is_ie8 = false;
</script>
<!--[if IE 8]>
  <script>
    is_ie8 = true;
  </script>
<![endif]-->

var为_ie8=假;

var为_ie8_或_newer=false;

我所见过的最有趣的技巧是动态利用IE条件注释功能,而不知道它的效率有多高。为此,您的代码在文档片段中获取一个隐藏的
或一个
,或其他内容,并在其中插入一些HTML,其中包含一个条件注释,用于检查特定的浏览器版本:

var dummy = document.getElementById('dummy');
dummy.innerHTML = '<!' + '--[if IE 8]>x<![endif]-->';
var isIE8 = dummy.innerHTML === 'x';
var dummy=document.getElementById('dummy');
dummy.innerHTML='x';
var isIE8=dummy.innerHTML=='x';

IE8可以在URL框旁边显示一个小按钮,用于在IE7模式和IE8模式之间切换浏览器。你可以打开“开发者工具”,它会告诉你当前的设置是什么。

我唯一能弄清楚如何让我的IE8版本说它是IE7的方法是启用兼容性视图。看

他的浏览器设置为在兼容模式下显示所有“内部网站”。此外,是的,兼容模式会更改用户代理字符串。

在以下位置找到此甜函数:

函数getIEVersion() { var v=3,div=document.createElement('div'),a=div.all | |[]; 而(div.innerHTML='',a[0]); 返回v>4?v:!v; };
您真的需要检查浏览器版本吗?或者你可以只使用特征检测吗?因为我[咒骂]讨厌浏览器检测。@geowa4-我是星号形式审查的狂热粉丝。:)@是啊,好吧[咒骂]你!:-P@geowa4:实际上,我正在寻找的是IE8提供的更好的CSS标准支持;我不知道如何专门针对这一点进行功能检测。当然,我可以为IE8的特定功能检测。不管怎样,问题仍然存在,为什么用户代理报告以前的版本?或者更确切地说,我的web应用程序在做什么导致用户代理误报,因为如果它误报,这可能意味着web应用程序正在将其置于兼容模式,这正是我不想看到的行为——嗅探比JS中的版本检测更糟糕——请看Chrome的UA了解疯狂的味道:
用户代理:Mozilla/5.0(X11;U;Linux x86_64;en-US)AppleWebKit/533.2(KHTML,像Gecko)Chrome/5.0.342.9 Safari/533.2
(一些脑死脚本正在寻找“Gecko”在脚本中,因为这就是Firefox的功能;不要让我开始使用最初的“Mozilla”)Modernizer检测功能,而不是bug、不兼容或浏览器versions@Yi江:啊,好吧,我一定是误解了。我是在回应关于用户代理的部分。@Piskvor,我是在回应这个答案的原始海报。。。当我输入评论时,你的评论没有出现。。。。澄清。@Yi Jiang:这通常是(通常是?)人们询问有关用户代理嗅探的合法意图@Piskvor:我不是在鼓吹什么,只是回答了这个问题。他想看看他的场景有什么奇怪之处——我怀疑可能是这样。我不确定这是否适用于在兼容模式下运行的浏览器。你测试过了吗?@Rushyo:我想这正是你想要的:歌剧本身仍然是歌剧,表现得像歌剧。视情况而定。覆盖用户的意图通常是一件坏事(tm)。然后呢,,用户是一个依赖欺骗的白痴。我会扭转这种情况,并假设用户没有使用IE8,并使用条件注释来检测IE8并更新var。这是因为并非所有浏览器都支持这些注释,而且市场份额正在快速下降-默认情况下最好针对当前/未来趋势。这在IE10+上不起作用自从IE10停止支持条件评论以来,我已经听过无数次了,当你处理一个特定的功能时,这是真的。但是,当这是一个与你仍然需要处理的特定功能无关的怪癖时,制定不涉及检测与你正在做的事情完全无关的事情的策略是很有帮助的。
var dummy = document.getElementById('dummy');
dummy.innerHTML = '<!' + '--[if IE 8]>x<![endif]-->';
var isIE8 = dummy.innerHTML === 'x';
function getIEVersion() 
{    
    var v = 3, div = document.createElement('div'), a = div.all || [];
    while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]); 
    return v > 4 ? v : !v;    
};