Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порядок с окнами в скриптах - top, window, self, this, где какой объект писать 
:(
    Опции темы
SelenIT
Дата 28.10.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401




M
12345c
Разделил обсуждение на 3 темы, так как предметы у каждой из них на самом деле разные. В любом случае, обсуждения ценные, поэтому нормально, что тема туда пошла, разделить всегда успеем.
Эта тема - о сходстве и неравенстве объектов типа окна в разных браузерах.

12345c, очень интересная вещь...
Код

javascript:void(alert([window===self, top===window, top===self, this===window, this===top, this===self]))

Выполнял прямо в адресе на странице с Вашим кодом, void() по идее гарантировал отсутствие перехода.

Результаты:
FF1.5, Op. 9.01: true, true, true, true, true, true
IE 6.0.2900 (SP2): false, false, true, true, false, false
Op. 8.02: true, true, true, false, false, false (!)

Первая строчка (они же самые новые), видимо, действуют правильно.
Про IE6 давно была известна такая беда, что self у него находится в сложных отношениях с window, а попросту глючит. Получается, window в нем вообще стоит особняком от всех своих алиасов. 
Но вот результат 8-й оперы я объяснять не берусь...

Это сообщение отредактировал(а) 12345c - 31.10.2006, 15:45
PM MAIL   Вверх
AKS
Дата 28.10.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
Цитата

Про IE6 давно была известна такая беда, что self у него находится в сложных отношениях с window, а попросту глючит...

Мне кажется не стоит особенности браузера называть "глюками". Ведь можно же в результате, который получен в IE, усмотреть логику:
Код

window===self // false

window - объект, self - в IE св-во (или атрибут) объекта window, результат закономерен, то же и со следующим сравнением (window===top).
Код

top===self // true

откройте во фрейме - получите другой результат, и опять все будет ясно.
Цитата

this===window // true

тут тоже все понятно - this указывает на текущий контекст, в данном случае - это глобальный контекст (window), а с двумя остальными то же, что и с двумя первыми.

PM MAIL   Вверх
SelenIT
Дата 28.10.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS,

Цитата(AKS @  28.10.2006,  08:46 Найти цитируемый пост)
window - объект, self - в IE св-во (или атрибут) объекта window, результат закономерен

С одной стороны, оно так... но с другой стороны - свойство это содержит ссылку на сам объект, а т.к. в JS все объекты, кроме примитивных типов, являются ссылками (поправьте, если я в этом заблуждаюсь) - то это должна быть в точности та же самая ссылка, и в новых браузерах (FF, Op.9) это так и есть. Опять встает вопрос "кто же прав и почему".

Цитата(AKS @  28.10.2006,  08:46 Найти цитируемый пост)
откройте во фрейме - получите другой результат

В данной теме все же интересует поведение верхнего окна. Опять же, следуя логике предыдущего пункта, top и self - принципиально разные свойства объекта window, почему же для верхнего окна они содержат одну и ту же ссылку (top===self)? А раз так, то что мешает каждому из них содержать честную ссылку на сам объект? Нет, что ни говорите, логика здесь какая-то странная.

И наконец: какой логикой Вы объясните поведение 8-й Оперы, где глобальный контекст (this) не эквивалентен ни window, ни его свойствам-псевдонимам?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 28.10.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
Цитата

...логика здесь какая-то странная

А какая-бы она ни была, все-таки ведь какая-то логика есть (она не может не есть ;) ). И ее нужно понять. Давайте опять с первого сравниения в IE:
Код

window===self  // false
window.window===window.self  // true

Можно такое понять? А почему бы и нет! Можно предположить, что в IE есть явный глобальный объект window и есть еще window.window - св-во, указывающее на текущее окно браузера, и это не сосем одно и то же при строгом сравнении. А можно предположить, что это всего-навсего различия в работе оператора строго сравнения. Т.е., в FF при строгом сравнении один результат, а в IE - другой, и это как раз благодаря оператору строгого сравнения, которому удается "углядеть" какую-то разницу в IE.
Цитата

top и self - принципиально разные свойства объекта window

Разными они будут во фрейме, а в одиночном окне указывают на текущее окно. Отсюда и результат, который одинаков во всех браузерах:
Код

top===self // true in single window
top===self // false in frameset

Цитата

какой логикой Вы объясните поведение 8-й Оперы

Объяснять я ничего не хотел бы, я ведь предложил дружно, так сказать, попытаться отыскать эту самую логику. 
Почему в Opera'х сначала было this===window, а теперь нет - видимо пошли по пути разработчиков IE...
PM MAIL   Вверх
SelenIT
Дата 28.10.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, по поводу IE в той теме трехлетней давности на Xpoint'е было предложено объяснение, которое кажется мне очень правдоподобным. Если так, то какой бы ни была исходная идея, реализована она все-таки глючно).

Цитата(AKS @  28.10.2006,  15:17 Найти цитируемый пост)
Почему в Opera'х сначала было this===window, а теперь нет

Извините, Вы, видимо, перепутали - это теперь все четыре ссылки (window, top, self и this) эквивалентны (как в FF), а в 8-й версии было что-то странное - ссылки на окно были эквивалентны между собой, но не совпадали с глобальным контекстом.

Это сообщение отредактировал(а) SelenIT - 28.10.2006, 15:34


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 28.10.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
Цитата

реализована она все-таки глючно

А мне, вообще-то, нравится философия тех, кто обожает FF и не устает "бросать камни в огород" IE. Любое отличие от FF - "глюк"!
PS На Xpoint я никакого объяснения не видел, если Вы, конечно, не считаете объяснением вот эту фразу: "Похоже, хороший косячок нарыли"...

Добавлено @ 15:49 
SelenIT, по большому счету, вот что есть в стандарте, касательно всех top&self&window.window:
Цитата

Not part of any standard/Not part of specification

PM MAIL   Вверх
SelenIT
Дата 28.10.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, объяснением я посчитал это:
Цитата

Однозначно у IE в памяти зачем-то два объекта с идентичным содержимым, причём обработчики событий забыли сихронизировать.

Глюком, соответственно - вторую часть этой фразы. И отличия от FF тут ни при чем. Вообще, хоть я и вправду обожаю FF и не собираюсь переходить с нее на 9-ю оперу (которая объективно как минимум не хуже), многое в "лисьих штучках" меня тоже порядком достает - например, то как она рендерит "настоящий" XHTML (только после полной загрузки кода, и в этот же момент происходит onload, а картинки как ни в чем ни бывало грузятся себе потом). Вообще, глюками всегда кажется непривычное поведение и отличия от злополучных "интуитивных представлений" о том, "как это должно быть". Побочный эффект этого - для человека, привыкшего к глюкам, глюком кажется "правильное" (с точки зрения стандартов) поведение. Впрочем, стандарты тоже пишут люди, так что субъективный фактор и тут не исключается... но это уже далеко уходящая в оффтоп общая философия:)

PM MAIL   Вверх
AKS
Дата 28.10.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



12345c, а нельзя ли выделить обсуждение св-в объекта window в отдельную тему? А то SelenIT напугал меня фразой:
Цитата

...но это уже далеко уходящая в оффтоп общая философия

, а я хотел бы еще "попереливать из пустого в порожнее" на эту тему. 
Или, может быть, можно прямо здесь?
Кстати, у меня одинаково работает конструкция 
Цитата

javascript:frames.main.document.write()

с аргументами top.s и с s...
PM MAIL   Вверх
AKS
Дата 29.10.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
Цитата

Согласен с SelenIT по поводу глючной реализации.

А я с некоторых пор (благодаря Вам) смотрю на это под таким углом зрения - IE6 сделан очень давно и в наши дни многое может казаться "глючным", но на самом деле не все так просто. 
Почитывая разные книжечки о программировании, я где-то встречал следующую концепцию:
"Аналогично, но не идентично". 
Может и здесь что-то подобное?
Цитата

Всё норовите обидеть мой любимый IE

Вообще-то в контексте моих сообщений это должно было выглядеть как-раз наоборот...

PM MAIL   Вверх
AKS
Дата 30.10.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



У меня появились еще кое-какие соображения насчет "глюков" IE, хочется поделиться ими с собеседниками.
Начну с "равенства, но не тождественности двух объектов" (window & self). Может быть  все же это не "промах", а как раз "злой умысел" разработчиков с целью лишить нас возможности писать в дочернем окне что-нибудь, типа:
Код

top.onunload = function() {}

? Ведь в таком случае понятно, почему window !=== top, так ведь? Может, конечно, возникнуть вопрос: "Почему я не могу писать top.onresize = function() {}?". Но, думаю, у разработчиков возник бы резонный встречный вопрос: "А почему бы не написать именно в окне верхнего уровня onresize = function() {}?"
Продолжу уже примерами с Xpoint (куда SelenIT настойчиво предлагал обратиться за знаниями). Вот один "вариант глюка":
Код

<body onload='alert(this==window)' onclick='alert(this==body)'>

Оба предупреждения выдадут true, и это может кого-то удивить (и, в общем-то, удивило). Однако, удивление быстро пройдет, стоит только прочесть на MSDN Library следующую ремарку:
Цитата

In the absence of a "window" element, the body element hosts the following window object events: onblur, onbeforeunload, onfocus, onload, and onunload.

Т.е., хоть body и может "по-хозяйски" распорядиться методами "хозяина", отнюдь "тело" не будет caller'ом для перечисленных методов (и onload в частности).
А вот самое интересное (тоже с Xpoint):
Код

<body onload='alert(this===window)'> // false

Можно связать это с предыдущим примером, предположив, что раз body "подменил на время" window, и хоть this==window, но не совсем window (this!==window). Но вот стоит только сохранить указатель на вызывающий объект в глобальной переменной:
Код

<script>var t;</script>
<body onload='t=this;alert(t===window)'> // true

, или передать параметром в функцию:
Код

<script>function a(e){ alert(e===window) }</script>
<body onload='a(this)'> // true

 - результат будет противоположным. И вот здесь уже я объяснения пока не нахожу. Из примера, конечно же, видно, что дело в контексте выполнения, но еще не совсем все ясно. 
Конечно же, можно все это списать на "врожденную невнимательность и беспечное отношение к работе" со стороны разработчиков IE. И это было бы легче всего...
PM MAIL   Вверх
AKS
Дата 30.10.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Вот над этим:
Код

<script>function a(e){ alert(e===window) }</script>
<body onload='alert(this===window/*false*/);a(this/*true*/)'>
 
долго думать не стал. "Потыкавшись" немного, решил, что объяснение - вот оно:
Код

<script>function a(e){ alert(e===window) }</script>
<body onload='a(window)'> // false

Ну и как вам, собеседники? Оказывается, окрыв страницу, IE создает window, но это "окно" не идентично тому, что будет после полной загрузки страницы.
PM MAIL   Вверх
SelenIT
Дата 30.10.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, а по-моему, объяснение в этом:
Код

<script>function a(e){ alert(e===window.window) }</script>
<body onload='a(window)'> // true

Функция-то не знает о глобальном объекте window - она тупо ищет переменную по scope chain и в итоге находит свойство глобального объекта с таким именем...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 30.10.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
А если так, то "кто там и что знает":
Код

<script>function a(e, f){ alert([f, e===window]) }</script>
<body onload='a(window, "onload")'> // false
<script>a(window, 'programm')</script> // true

 - без Zeroglif не разберешься...
PM MAIL   Вверх
SelenIT
Дата 30.10.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, признаю, поторопился. Новые факты явно в пользу Вашей версии. Подождем Zeroglifа...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 30.10.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
продолжая пытать "преступника" IE, удалось выяснить следующее:
1 обращаясь к ключевому слову window в коде программы, мы получаем доступ к глобальному объекту;
2 обращась к ключевому слову window из документа (в аттрибутах тэгов, например), вместо глобального объекта мы получаем кое-что другое, а именно window.window, window.self, и т.д.
Истину получим вот так:
Код

<body onload='alert(this.window===window)'> 

Здесь ключевое слово this и есть глобальный объект, чье событие было "обработано", а window сами видите что такое (именно то, что разработчики "обозвали"  Attributes/Properties).  
Ну и как Вам "глюки"? Согласитесь, для "глюков" все слишком закономерно...
 
 



PM MAIL   Вверх
SelenIT
Дата 30.10.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, закономерно-то оно закономерно... но в чем же тайное предназначение этой закономерности?

Разве нормально (с точки зрения JS-разработчика), что 
Код

<body onload="alert([2, this.onload, window.onload])">
<script>
alert([1, this.onload, window.onload])
</script>
и
Код

<body>
<script>
onload=function(){alert([2, this.onload, window.onload])}
alert([1, this.onload, window.onload])
</script>
дают настолько разный результат? Какими практическими соображениями оправдано отсутствие второй ф-ции во втором алерте первого примера? Почему-то эта логика от меня упорно ускользает...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
JSman
Дата 30.10.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006

Репутация: нет
Всего: 4



ребят, я наверное новичок, но сравнение указателей на объекты дело очень противоречивое. идентичность объектов сравнивется по наличию свойств, например. ==, === - не критерий.

указатели на объекты по-разному устроены в различных браузерах. поэтому и получаются разные значения при сравнении.


PM ICQ   Вверх
AKS
Дата 30.10.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
Цитата

Какими практическими соображениями оправдано отсутствие второй ф-ции во втором алерте первого примера?

 Вы мой, теперь уже предпоследний пост не прочитали (а жаль - я так старался целый день, гнул свои выпрямленные расческой извилины ;) ). 
Вот если бы прочитали, то было бы понятно, что нет функции, так как ее Вы не определяли! Вы писали:
Код

window.self.onload = function() {var SelenIT;}

? Нет! Попробуйте так:
Код

<body onload="alert([2, this.onload, window.onload])">
<script>
window.self.onload = function() {var SelenIT;}
alert([1, this.onload, window.onload])
</script>


Добавлено @ 16:36 
JSman, 
Цитата

указатели на объекты по-разному устроены в различных браузерах. поэтому и получаются разные значения при сравнении.

А мы, между прочим, давным-давно только про IE беседуем. Присоединяйтесь!

Это сообщение отредактировал(а) AKS - 30.10.2006, 16:43
PM MAIL   Вверх
SelenIT
Дата 30.10.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, что обработчики событий глобального window и его одноименного свойства (с вариациями в виде self и т.п.) абсолютно "отвязаны" друг от друга - понятно, спасибо (об это набивали шишки еще 3 года назад). Теперь же меня интересует не академическая, а практическая сторона: не "почему так", а "зачем сделано именно так" (если, конечно, так сделано специально)? Моя интуиция все же упорно требует, чтобы все свойства (включая обработчики событий) объекта окна были доступны по любой ссылке на него - и мозилла с оперой этих моих ожиданий почему-то не обламывают. Хочется постичь логику IE не только в симптомах, но в сути...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 30.10.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, 
Цитата

Теперь же меня интересует не академическая, а практическая сторона: не "почему так", а "зачем сделано именно так"...

Эх, я бы тоже хотел знать зачем так сделано! Сегодня я уже одно предположение высказал:
Цитата

...с целью лишить нас возможности писать в дочернем окне что-нибудь, типа:
top.onunload = function() {}

Надеюсь, теперь кто-нибудь еще что-нибудь расскажет...
Цитата

Хочется постичь логику IE не только в симптомах, но в сути... 

А Вы не читали вот здесь ту часть топика, что касается объекта Event в IE? 
После этого я как-то иначе стал воспринимать этот сложный браузер (хотя и до этого знал, что он не так-то прост и "неуклюж", как принято теперь считать)... Почитайте, если не читали.
Цитата

если, конечно, так сделано специально...

А может и не специально. Я вроде бы несколько раз предположил, что может разработчики IE как раз такие "недотепы", что допустили такое в своем браузере. Мало ли, может кто-то запил в момент сдачи проекта ;) - а мы теперь с Вами ломаем голову...  ;)
PM MAIL   Вверх
SelenIT
Дата 30.10.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, спасибо, обязательно постараюсь "асилить". Ту тему я смотрел, но бегло - теперь понимаю, что надо было перечитывать ее несколько раз до просветления. Объектная модель событий - до сих пор вообще мое слабое место в JS, а уж тонкие нюансы ее реализаций...

...И все же насчет возможной защитной ф-ции разделения обработчиков window и window.window осмелюсь выразить сомнения - маловероятно, что разработчики предусмотрели это, но пропустили "мегафичу" в виде "opener=1; close();"...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Zeroglif
Дата 30.10.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



В IE глобальный объект (global) и окно (window) - разные сущности, объединённые в некий global namespace. IE на себе тащит не один скриптовый язык, видимо нужно, чтобы разным языкам комфортно работалось совместно в окне браузера. Может ещё какие причины для разделения были, не знаю, предполагаю только. Но если строго следовать логике EcmaScript, то разница никого не должна волновать, все алгоритмы EcmaScript должны работать так, будто объект один и тот же, как бы его не трогали. Но IE в этом контексте не смог решить некоторые проблемы вроде нумерации свойств глобального объекта плюс есть узкие места, где эта разница начинает влиять, к примеру, те самые "скрипты в атрибутах" или ID элементов, равные свойствам window.

Проблема этого примера
Код

<body onload='alert(this===window)'> // false

связана со скриптом в аттрибуте, это intrinsic event. Scope chain такого обработчика са-мо-дель-ная во многих браузерах, и везде по-своему. К примеру, там может быть объект document, для элементов форм там может быть и будет сам элемент и т.д., а самое главное не гарантировано то, что на конце цепочки будет глобальное свойство window, а не "текущее window". Как-то ведь надо было для фреймов реализовывать идею ТЕКУЩЕГО ОКНА (window.self или его синоним window.window). Значит, в одиночном окне при встрече IE с intrinsic event, он создаёт scope chain, специально отделяя текущее окно (из html которого с ним пытаются работать) от глобального, то есть идентификатор window - это сокращённая форма window.window. Другой вопрос, что тождественность всё-таки надо было реализовать правильно, в одиночном окне ссылки должны бы вести в одно место...

Зачеркнул. Не о том это я, намешал всё  в кучу, тут всё-таки особенность именно в body. Буим думать дальше.

Это сообщение отредактировал(а) Zeroglif - 30.10.2006, 20:04
PM MAIL WWW   Вверх
AKS
Дата 30.10.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
Цитата

в одиночном окне ссылки должны бы вести в одно место

Так ведь они ведут в "одно место", разве нет? А где вообще на этой почве возникают какие-либо конфликтные ситуации? Или проблема только в том, что некто Вася Пупкин не смог реализовать какой-нибудь такой вот "перл":
Код

top.onresize = function() {}

 ?
SelenIT, 
Цитата

"opener=1; close();"

А я не ошибаюсь, что понравившаяся Вам Opera 9 позволяет закрыть окно вообще без opener'а? Если не ошибся, то чего же ждать от "старика"?

Добавлено @ 19:12 
Честно говоря, пусть это все "глюки", но я рад, что все-таки сегодня раскопал закономерность...
PM MAIL   Вверх
AKS
Дата 30.10.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Эх! Забыл поблагодарить собеседников, которые помогли мне понять window.window в IE! Однако сказывается отсутствие должного воспитания! А благодарить ведь есть за что - мне эта alert(this===window/* false */) да-а-авно покоя не давала, и здесь вдруг раз - все "прояснилось"... ;)
Так что спасибо, SelenIT, Zeroglif! 
PM MAIL   Вверх
SelenIT
Дата 30.10.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, спасибо и Вам, также присоединяюсь к благодарностям Zeroglifу, и отдельное спасибо автору темы, уважаемому 12345c!


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 31.10.2006, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата

спасибо автору темы, уважаемому 12345c! 

И я благодарю автора темы - спасибо еще и за то, что не "зарезали" оффтоп!

Эх, какой здесь простор для бесконтрольной мозговой деятельности, время от времени возникающей в моей голове! ;)

 SelenIT, Zeroglif! Снова обращаюсь к вам! Мне бы очень хотелось вот здесь написать маленькую, о-о-очень маленькую заметку на эту текущую тему (буквально два-три абзаца). Так вот посоветуйте - как представить все это (я имею ввиду window!==window.window). Как недоработку или же как особенность браузера? 
Сами понимаете - хотелось бы "похвастаться", написав, что мы тут с вами узнали где и в какое "окно"  мы "лезем" ;). Хотя если хоть один из вас не проявит интерес вот к этому сообщению, то я буду считать, что этой темой не стоит "хвастаться". Опять же буду расценивать это, как помощь с вашей стороны.


PM MAIL   Вверх
Zeroglif
Дата 31.10.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  31.10.2006,  08:54 Найти цитируемый пост)
Сами понимаете - хотелось бы "похвастаться", написав, что мы тут с вами узнали где и в какое "окно"  мы "лезем"

Лично я для себя точно ничего не выяснил, мне не открылось:

a) почему такой своеобразный this в body.onload и связано ли это с тем, что он хостит чужой обработчик?
б) почему криво реализована тождественность и есть ли смысл в такой кривости;

По пункту а) остаётся только гадать. По пункту б) я чирканул письмецо одному из разрабов JScript (E.Lippert), но он так давно этим не занимается, что может легко забыть ответить. smile
PM MAIL WWW   Вверх
AKS
Дата 31.10.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
Цитата

Лично я для себя точно ничего не выяснил...

Да, я тоже вот сейчас "отдышался", пришел в "себя", и понял - рано пока "шорох" подымать...
Цитата

чирканул письмецо одному из разрабов JScript...

Ого, вселяет надежду...
Цитата

может легко забыть ответить

Ну-у-у, значит не судьба! Будь что будет, от добра добра не ищут...
Цитата

почему такой своеобразный this в body.onload и связано ли это с тем, что он хостит чужой обработчик

А что, вроде бы написано же у них, что хостит?
Я пока про intrinsic events хорошенько почитаю (раньше-то не читал!). Получается так, что каждая функция в аттрибуте создается вариантом, с использованием конструктора Function? Может это накладывает какой отпечаток?
PM MAIL   Вверх
WingedFox
Дата 31.10.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



Я бы сказал, что это ошибка проектирования в бОльшей мере.
Или попытка как-то закрыть дырку с отсутствием глобального объекта до окончания загрузки. Об этом говорит такой эксплойт: 

Цитата
 The vulnerbility is caused due to certain objects not being initialized correctly when the "window()" function is used in conjunction with the "<body onload>" event. This can be exploited to execute arbitrary code on a vulnerable browser via some specially crafted JavaScript code called directly when a site has been loaded.

http://secunia.com/advisories/15546/
PM MAIL   Вверх
AKS
Дата 31.10.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



WingedFox, 
Цитата

Или попытка как-то закрыть дырку с отсутствием глобального объекта до окончания загрузки...

Вот, пожалуйста! Еще один вариант объяснения поведения IE. А ведь действительно, может же быть такое поведение результатом "наложения заплаток" на движок. 
А как раньше было с этими "окнами" в IE? 
"Раньше" - это я имею ввиду IE4, например. Я его даже издалека не видел... 

Это сообщение отредактировал(а) AKS - 31.10.2006, 13:05
PM MAIL   Вверх
SelenIT
Дата 31.10.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Кстати, только что случайно наткнулся на занятный драфт от W3C - оказывается, полгода назад там все-таки задумались о том, чтобы навести некий порядок в "оконной" проблеме. Там, в частности, требуется (must) тождественность (именно в смысле эквивалентности) значений атрибутов window и self друг другу и самому объекту window. Похоже, браузеры 2006 года решили этому последовать, и имхо это хорошо.

Интересно, как по этой части обстоят дела в IE7...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 31.10.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, это же попытка реализовать все то, что ваша "интуиция упорно требует" !   ;) 
А если серьезно - почему "занятный"? Вроде как раз то, что нужно, так ведь?

Вообще, такие вот "черновики" долго превращаются в стандарты? 
PM MAIL   Вверх
SelenIT
Дата 31.10.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



По идее, действительно, то, что нужно - занятным мне показалось, что спохватилсь только в этом году)
Насчет превращения черновиков в стандарты... честно говоря, не компетентен, но по-моему обычно проходит больше года и не меньше трех-четырех редакций...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Zeroglif
Дата 31.10.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(SelenIT @  31.10.2006,  15:05 Найти цитируемый пост)
Интересно, как по этой части обстоят дела в IE7

В IE7 всё те же проблемы, проверил быстренько из адресной строки.
PM MAIL WWW   Вверх
JSman
Дата 31.10.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006

Репутация: нет
Всего: 4



ой ну и поздновато я присоединился))
постараюсь наверстать упущенное. если вдруг повторения, прошу простить.

говоря о логике ие.

Цитата(SelenIT @  28.10.2006,  00:58 Найти цитируемый пост)
javascript:void(alert([window===self, top===window, top===self, this===window, this===top, this===self]))


по поводу их значений.
по моему мнению ие совершенно правильно сравнил их.

== - сравнение их значений (values)
=== - проверка значений и совпадение типа (не встроенного типа object).

self, top - свойства window, а не сам хост. поэтому они не идиентичны.
this в тэге HEAD - ссылка на window. а если она внутри тэга body, то ссылка на элемент в котором this находится. исключением является <BODY ONLOAD="this. ...">, где this - это ссылка на window? потому что document.body.onload===window.onload

Добавлено @ 00:01 
мне кажется this в <BODY ONLOAD="this. ..."> - это как переменная, она хостом не является.
поэтому при проверке this===window буде false
PM ICQ   Вверх
Zeroglif
Дата 1.11.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



JSman

Цитата

== - сравнение их значений (values)
=== - проверка значений и совпадение типа (не встроенного типа object).

Алгоритмы сравнений и в том, и в другом случае схожи для object type. Мы же исходим из того, что и window, и top, и self имеют один и тот же тип - object. Значением этих идентификаторов является ссылка на объект. Если объект у них разный, то мы должны были бы получить false уже при нестрогом равенстве, чего не происходит.

Равенство (11.9.3 The Abstract Equality Comparison Algorithm) 
The comparison x == y, wherex and y are values, produces true or false. Such a comparison is performed as follows:
1. If Type(x) is different from Type( y), go to step 14.
2.If Type(x) is Undefined, return true.
3.If Type(x) is Null, return true.
4.If Type(x) is not Number, go to step 11.
...
11.If Type( x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
13.Return true if x and y refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false.

Строгое равенство (11.9.6 The Strict Equality Comparison Algorithm) 
The comparison x === y, where x and y are values, produces true or false. Such a comparison is performed as follows:
1.If Type(x) is different from Type(y), return false.
...
13.Return true if x and y refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false.

Цитата

self, top - свойства window, а не сам хост. поэтому они не идиентичны.

Это не должно иметь значение, объект может иметь свойство, значением которого будет ссылка на него самого. При сравнении имя-объекта===имя-свойства-объекта мы должны получить true, т.к. это один и тот же объект и алгоритм сравнения прописан чётко, host/не host не должно играть никакой роли вообще.

PM MAIL WWW   Вверх
JSman
Дата 2.11.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006

Репутация: нет
Всего: 4



я поясню свою логику, думаю,  что сравнение объекта хоста с его переменными self, top не должно быть true, так как теряется смысл использования строгого равенства.
 тогда зачем нам ===? если есть возможность использовать ((x==y)&&(typeof(x)==typeof(y))).

более того, объект хост существует только в единственном экземпляре, все остальные, переменные, -ссылки на него. поэтому и тип разный, хотя и пишет, что object. а вообще по документации существует 4 типа объектов..
PM ICQ   Вверх
Zeroglif
Дата 2.11.2006, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(JSman @  2.11.2006,  00:28 Найти цитируемый пост)
сравнение объекта хоста с его переменными self, top не должно быть true, так как теряется смысл использования строгого равенства

Фишка в том, что концептуально EcmaScript-y наплевать с высокой колокольни на причуды хоста и иже с ним. Алгоритмы должны быть реализованы так, как описаны, если UA считает, что реализовал EcmaScript комформно.

Цитата(JSman @  2.11.2006,  00:28 Найти цитируемый пост)
тогда зачем нам ===? 

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

Цитата(JSman @  2.11.2006,  00:28 Найти цитируемый пост)
более того, объект хост существует только в единственном экземпляре

В IE global namespace - это чёрный ящик, объект Global сам по себе, WINDOW само по себе (но нам незаметна разница), а кроме того встречаются какие-то объектные привидения для работы с ID элементов, можно даже попробовать как-нибудь это доказать...
PM MAIL WWW   Вверх
AKS
Дата 2.11.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
 
Цитата

кроме того встречаются какие-то объектные привидения для работы с ID элементов...

Ух, обожаю "привидения"! Еще одна тайна! Только за это можно в IE влюбиться навеки...
А если серьезно, то может, хотя бы в общих чертах, но чуть подробней, чиркнете об этом пару строк?
PM MAIL   Вверх
JSman
Дата 2.11.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006

Репутация: нет
Всего: 4



Цитата(Zeroglif @  2.11.2006,  01:04 Найти цитируемый пост)
Фишка в том, что концептуально EcmaScript-y наплевать с высокой колокольни на причуды хоста и иже с ним. Алгоритмы должны быть реализованы так, как описаны, если UA считает, что реализовал EcmaScript комформно.


мне кажется Microsoft просто дальше пошли. и дело не в неправильной реализации, а то, что EcmaScript больше полагается на Web, а Microsoft использует JS для многих целей (типа WSH)

Цитата(Zeroglif @  2.11.2006,  01:04 Найти цитируемый пост)
Потребовалось когда-то для некоторых операций проверять совпадение типов - сделали нужный алгоритм, потом под это дело и оператор нарисовали, но в подавляющем большинстве случаев обходятся и без него.

typeof, если не изменяет память с javascript 1.0, а === с 1.3
более того, посмотрел в одном справочнике, что 
=== - NN n/a  IE J3  ECMA n/a IE 3  ECMA n/a.

т.е. ИЕ раньше начал использовать ===, чем это стало стандартом

Это сообщение отредактировал(а) JSman - 2.11.2006, 21:00
PM ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.