我正在做一个递归,通过整个树的javascript对象可从窗口全局作用域。
在Chrome, Firefox和Safari中一切都很好,但是在Internet Explorer中我遇到了一点问题。
基本上,当我遍历树时,我正在构建一个对象堆栈,所以我可以检查一个对象的行是否在多个地方被赋值。例如,我检查
var ignoreStack = [window, document]; // grows over time to contain every object
ignoreStack.contains = function(obj) {
for(var i=0;i<this.length;i++) {
if (this[i] === obj) {return true;}
}
return false;
};
// ... further down the line inside a recursion
if (!(obj instanceof Object)) {return;}
for (var prop in obj) {
if (ignoreStack.contains(obj[prop])) {return;}
ignoreStack.push(obj[prop]);
recurse(obj[prop], prop);
}
现在唯一的问题是当它检查以下内容时:
// Returns true in Chrome, Safari and Firefox
console.log(window.frames.frames === window.frames);
// Return false in IE
树中的所有其他对象都等于自身,但是IE中的window.frames
似乎是唯一的例外,它对自身不为真,因此递归继续如下:
// window.frames.frames.frames.frames.frames ...etc
有人知道为什么window.frames
不等于它自己吗?
我试着做一些挖掘在谷歌和调试使用IE开发工具,我所能收集的是,它的类型为DispHTMLWindow2
的对象(不是说,这意味着很多对我来说)和(不像在其他浏览器)它既不是一个对象也不是一个数组。
// Returns true in Chrome, Safari and Firefox
console.log(window.frames instanceof Object);
// Return false in IE
如果有人能说明为什么window.frames
在IE中的行为不像任何其他javascript对象(导致这种类型的无限递归),那将是非常感激的。
其他主机对象在IE中不相等的相关问题
如果有人能解释一下为什么IE中的window.frames的行为不像其他javascript对象(导致这种类型的无限递归),我将不胜感激。
window.frames
是一个主机对象。在ES3中,宿主对象可以为所欲为。IE因拥有行为异常的主机对象而臭名昭著。你对此无能为力。
我建议你做肮脏的hack,这是一个硬编码检查是否密钥是'frames'
和对象是window
,忽略整个事情。
在window.frames
中还有另外一堆属性也没有表现。