IE Bug (окно === top) === false
В IE.
window === top; // false
window === window.window // false
window == top; // true
window == window.window // true
В FF3.6 и стабилизации Chrome этого не происходит.
В IE typeof
, .toString
, Object.prototype.toString.call
все возвращают одинаковые как для top
, так и window
Это связано с этим.
Может ли кто-нибудь сказать мне, почему IE не может выполнять строгую равномерность?
Обратите внимание, что круговая ссылка не вызывает проблем в IE и Chrome.
o = {};
o.o = o;
o === o.o; // true
Выключает
window.window === window.top; // true
window.window === window.self; // true
Так что это проблема с получением window
на нем.
for (var i in window) {
if (window.window[i] !== window[i]) {
console.log(i); // external, frames, clipboardData
}
}
[изменить]
Теперь это становится глупо:
window.frames === window.frames; // false
window.frames == window.frames; // false
window.external == window.external; // true
window.external === window.external; // false
window.clipboardData === window.clipboardData; // false
window.clipboardData == window.clipboardData; // false
[Дальнейшее редактирование]
получается, что window.frames содержит указатель на отладчик ie. Таким образом, отключение отладчика изменяет объект window
. Я должен сделать еще несколько тестов.
window.frames.location === window.frames.location; // false
window.frames.location == window.frames.location; // true
window.frames.event.boundElements == window.frames.event.boundElements; // false
Не говоря уже о том, что window.external
просто не играет красиво
>>for (var i in window.external) alert(i);
"Object doesn't support this action"
Ответы
Ответ 1
Это не совсем ошибка: объекты-хосты могут делать все, что им нравится, а объект window
- особенно сложный зверь, служащий двойным целям, являющимся объектом, представляющим окно браузера, а также являющимся псевдонимом для глобальный объект. Я помешал бы это в качестве странности и не использовал бы строгий оператор ===
при сравнении объектов window
.
Обратите внимание, что это не "смех" JavaScript. Как и глобальный объект, window
- это объект-хост, и pre-HTML5 может быть законным (по крайней мере, по спецификации), но он понравился. Старые версии IE используют эту свободу и демонстрируют много причудливого поведения, для которого нет никакой спецификации. Попытка понять все это без доступа к исходному коду - это бессмысленное упражнение.
Ответ 2
Для тех, кто сталкивается с этой проблемой и нуждается в решении:
Я столкнулся с этой проблемой при разработке приложения для Facebook. Я хотел убедиться, что приложение было загружено в Canvas Page iframe, но в Internet Explorer window === top
всегда возвращает false.
Это:
window.top === window.self
должен работать во всех версиях IE (и других браузерах). Это здорово для определения, были ли вы созданы, и это счастливый, хорошо сформированный JS, который не заставит вас чувствовать себя грязным. Он работает внутри iframe, не бросая никаких предупреждений о безопасности.
Ответ 3
wtfjs является одним из моих любимых сайтов для действительно сумасшедших странностей, которые вы можете найти в Javascript.
Неудивительно, что эта небольшая функция IE получила упоминание вместе с попыткой объяснения: http://wtfjs.com/2010/02/25/ie-scope
Является ли это объяснение точным или нет, я не могу сказать, но эффект был отмечен раньше.
Итак, да, здесь может быть причуда в IE DOM.
Но это не было бы единственным причудом в IE, и это кажется мне одним из менее важных. На самом деле, если честно, почему это даже имеет значение? Помимо смеха над расходами на IE, какой прецедент всегда хочет сравнить window === top
в реальном мире script?
Ответ 4
window
имеет тенденцию быть глобальным объектом, а не страницей. window.window
будет свойством этого глобального объекта, называемого "окном", поэтому в теории они никогда не должны быть идентичными (===
), но могут быть похожими (==
), поскольку этот глобальный объект находится в глобальной области.
Я не тестировал это, но, как можно предположить, вам может повезти сравнивать self
(текущая страница) и parent