IE7和IE8命名和范围冲突

时间:2011-08-04 17:42:14

标签: javascript internet-explorer

我在维护的一些代码中找到了这些行,这些代码在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?

1 个答案:

答案 0 :(得分:2)

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