Ошибка IE (окно === вверху) === false - PullRequest
13 голосов
/ 31 января 2011

в IE.

window === top; // false
window === window.window // false
window == top; // true
window == window.window // true

В FF3.6 и Chrome stable этого не происходит.

В 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"

Ответы [ 4 ]

13 голосов
/ 31 января 2011

Это не совсем ошибка: хост-объекты могут делать все, что угодно, а объект window представляет собой особенно сложного зверя, служащего двойным целям: быть объектом, представляющим окно браузера, а также псевдонимом для глобальный объект. Я бы назвал это странным и не использовал бы строгий оператор === при сравнении Window объектов.

Обратите внимание, что это не "JavaScript странный" shrugpost. Помимо того, что он служит глобальным объектом, window является хост-объектом, и pre-HTML5 мог законно (по крайней мере, в соответствии со спецификацией) вести себя так, как ему нравится. Более старые версии IE используют эту свободу и демонстрируют очень странное поведение, для которого не существует никакой спецификации. Попытка понять все это без доступа к исходному коду - бессмысленное упражнение.

4 голосов
/ 04 апреля 2012

Для тех, кто сталкивается с этой проблемой и нуждается в решении:

Я столкнулся с этой проблемой при разработке приложения для Facebook.Я хотел убедиться, что приложение было загружено в iframe страницы холста, но в Internet Explorer window === top всегда возвращает false.

Это:

window.top === window.self

должно работать во всех версияхIE (и другие браузеры).Он отлично подходит для определения того, что вас подставили, и это счастливый, хорошо сформированный JS, который не заставит вас чувствовать себя грязным.Он также работает внутри iframe и не выдает никаких предупреждений безопасности.

3 голосов
/ 31 января 2011

wtfjs - один из моих любимых сайтов, где можно найти действительно дурацкие странности, которые можно найти в Javascript.

Неудивительно, что эта небольшая функция IE упоминается вместе с попыткой объяснения: http://wtfjs.com/2010/02/25/ie-scope

Я не могу сказать, является ли это объяснение точным или нет, но эффект был отмечен ранее.

Так что да, здесь может быть странность в DOM IE здесь.

Но это не единственная изюминка в IE, и мне кажется, что я один из менее важных. На самом деле, если честно, почему это вообще имеет значение? Кроме того, чтобы посмеяться над расходами IE, какой смысл в том, чтобы когда-либо захотеть сравнить window === top в реальном сценарии?

0 голосов
/ 31 января 2011

window имеет тенденцию быть глобальным объектом, а не страницей.window.window будет свойством этого глобального объекта, называемого «окном», поэтому теоретически они никогда не должны быть идентичными (===), но могут быть похожими (==), поскольку этот глобальный объект находится в глобальной области видимости.

Я не проверял это, но, возможно, вам повезет, сравнив self (текущая страница) и parent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...