我需要知道通过用户代理字符串识别自己的IE7或IE8的浏览器是否真的是那些浏览器,或者它是否是7或8兼容模式下的IE9.
从我在用户代理字符串中看到的,IE7兼容模式下的IE9,为真正的IE7提供了相同的字符串.是否有一个额外的属性/元素/对象,我可以测试它是否真的"伪装"IE9?
我假设文档模式无效,因为我的脚本加载到的页面可能是强制怪癖或强制特定设置.
我希望IE9具有一些存在的属性,无论是在7,8或9模式下都可以测试.
编辑添加...
好的,我现在看到我哪里出错了.我正在使用"浏览器模式"下拉菜单并将其切换到IE8和IE7,并认为这分别是"IE8兼容模式"和"IE7兼容模式".这当然不是真的.开发人员工具的浏览器模式确实将其切换为"就像"那些旧的浏览器,因此报告原始的useragent字符串是正确的.
如果我留在IE9或兼容IE9浏览器模式,并尝试将文档模式下拉变种来代替的话,我其实做得到"三叉戟/ 5.0"存在于所有8种组合(双浏览器模式和4种文档模式).我只需要避免选择浏览器模式IE7和IE8,因为它们确实是(模拟)IE7和IE8.
因此,页面,非开发人员用户,元标记或Microsoft的兼容性列表都无法将IE9置于这种无法识别的状态.
只需使用if(navigator.userAgent.indexOf("Trident/5")>-1)就足够了.
别担心,这不适用于样式,格式,逻辑或页面内容.我对这些东西使用特征检测.我只需要检测IE9(无论它处于什么模式)并做出非页面内容决定.
感谢您通过您的建议和链接指导我的答案.
我正在尝试使用setTimeout来执行我传递信息的匿名函数,我遇到了麻烦.这个(硬编码版本)可以正常工作:
setTimeout(function(){alert("hello");},1000);
setTimeout(function(){alert("world");},2000);
Run Code Online (Sandbox Code Playgroud)
但是我试图从数组中取出hello和world并将它们传递给函数,而不是(a)使用全局变量,以及(2)使用eval.我知道如何使用全局或eval来做到这一点,但是如何在没有它的情况下做到这一点.这是我想做的(但我知道它不会起作用):
var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
setTimeout( function(){alert(strings[i]);}, delay);
delay += 1000;
}
Run Code Online (Sandbox Code Playgroud)
当然,字符串[i]将脱离上下文.如何在没有eval或globals的情况下将字符串[i]传递给该匿名函数?
我有一些JS你会在下面看到.我希望内部类对象能够访问它的父级.它需要访问父方法和属性.我完成它的方式是工作,但我想知道我是否可以在内部类构造函数中做一些事情来获取父级,而不是父级必须明确地告诉孩子它的父级是谁.看起来很笨重.
<html>
<body>
<script>
function ChildClass(name){
//this.myParent= no way of knowing .....
this.myName=name;
this.whereDidIComeFrom=function(){
document.write(this.myName+ " came from " +this.myParent.dad+"<br>");
}
}
function ParentClass(name){
this.dad=name;
this.myChild=new ChildClass(name+"son");
this.myChild.myParent=this; //only way I know for myChild to access parent
this.myChild.whereDidIComeFrom();
}
var parentDavid = new ParentClass("David");
var parentJohn = new ParentClass("John");
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
运行的输出如下所示:
戴维森来自大卫
约翰逊来自约翰
我问,因为上面的结构已经存在于我正在维护的项目中.我不能重新设计整个事情.现在只有子对象必须访问它的父对象.以前它不需要.最好不要更改父类,并在子项中进行所有更改.但如果我得到的基本上是"你需要做什么"那么就这样吧.
任何人都可以解释(因为github页面没有)为什么Modernizr认为需要将所有这些类名添加到HTML标记中?加载Modernizr后,它看起来像这样:
<!doctype html>
<html class=" js flexbox canvas canvastext webgl ~~~~ etc etc
Run Code Online (Sandbox Code Playgroud)
我完全没有解释为什么要这样做.Modernizr提供的属性让我知道是否支持canvas(Modernizr.canvas == true?).这些html类名是否为测试添加了更容易?