小编Dee*_*000的帖子

JavaScript:我可以检测IE9是否在IE7或IE8兼容模式下?

我需要知道通过用户代理字符串识别自己的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(无论它处于什么模式)并做出非页面内容决定.

感谢您通过您的建议和链接指导我的答案.

javascript ie8-compatibility-mode internet-explorer-9

87
推荐指数
5
解决办法
9万
查看次数

将函数传递给循环中的setTimeout:总是最后一个值?

我正在尝试使用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]传递给该匿名函数?

javascript settimeout

17
推荐指数
3
解决办法
1万
查看次数

更好的子对象访问父对象的方法?

我有一些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)

运行的输出如下所示:

戴维森来自大卫

约翰逊来自约翰

我问,因为上面的结构已经存在于我正在维护的项目中.我不能重新设计整个事情.现在只有子对象必须访问它的父对象.以前它不需要.最好不要更改父类,并在子项中进行所有更改.但如果我得到的基本上是"你需要做什么"那么就这样吧.

javascript object parent

6
推荐指数
1
解决办法
6871
查看次数

使用Modernizr库,为什么要在html标记中添加类

任何人都可以解释(因为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类名是否为测试添加了更容易?

html5 modernizr

5
推荐指数
1
解决办法
4112
查看次数