Модераторы: 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   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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