Подтвердить что ты не робот

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"
4b9b3361

Ответ 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