Я делаю рекурсию по всему дереву объектов 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
Каждый другой объект в дереве равен самому себе, однако window.frames
в IE кажется единственным исключением, когда он не соответствует действительности, поэтому рекурсия продолжается следующим образом:
// window.frames.frames.frames.frames.frames ...etc
Кто-нибудь знает, почему window.frames
не равен самому себе?
Я попытался покопаться в гугле и отладить с помощью инструментов IE Developer, все, что я могу собрать, это то, что это объект типа DispHTMLWindow2
(не то, что это много значит для меня) и что (в отличие от других браузеров) это не объект и не массив.
// Returns true in Chrome, Safari and Firefox
console.log(window.frames instanceof Object);
// Return false in IE
Если бы кто-то мог пролить свет на причину, по которой window.frames
в IE ведет себя не так, как любой другой объект javascript (вызывая этот тип бесконечной рекурсии), это было бы очень полезно.
Заранее спасибо.