我在我正在维护的某些代码中找到了这些行,这些代码在7和8中失败。单步执行构造函数,我可以看到所有代码都在正确执行。但是,当构造函数返回时,出现“对象不支持此属性或方法”错误。 WTF?

需要注意的重要一件事是,变量embedDialog具有全局作用域(我知道全局变量是有害的,但我没有编写此代码)。

// Results in "Object does not support this property or method in ie8 and ie7
embedDialog = new Dialog({
    id: "embedDialog",
    width: 400,
    height: 400,
    message: "Check it out",
    title: 'Cool dialog box'
});


如果我给了embedDialog功能范围,那它就起作用了:

// Eliminate global scope and it works
var embedDialog = new Dialog({
    id: "embedDialog",
    width: 400,
    height: 400,
    message: "Check it out",
    title: 'Cool dialog box'
});


解决该问题的另一种方法是将id属性的值更改为变量名称之外的其他值,如下所示:

// Change "embedDialog" to "embedDialogBox" and voila it works
embedDialog = new Dialog({
    id: "embedDialogBox",
    width: 400,
    height: 400,
    message: "Check it out",
    title: 'Cool dialog box'
});


IE到底是怎么了?谁能解释为什么原始代码破坏了IE 7/8?

最佳答案

如果“ Dialog()”构造函数使用具有“ id”值(与全局变量相同)的DOM元素,则IE会使用该名称(显然与您的变量发生冲突)创建全局符号,并使其引用DOM元素。您的代码可能希望它是一个“对话框”实例。

关于javascript - IE7和IE8命名和范围冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6946061/

10-12 22:45