![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| SelenIT |
|
||||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
12345c, очень интересная вещь...
Выполнял прямо в адресе на странице с Вашим кодом, 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 |
||||
|
|||||
| AKS |
|
||||||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
SelenIT,
Мне кажется не стоит особенности браузера называть "глюками". Ведь можно же в результате, который получен в IE, усмотреть логику:
window - объект, self - в IE св-во (или атрибут) объекта window, результат закономерен, то же и со следующим сравнением (window===top).
откройте во фрейме - получите другой результат, и опять все будет ясно.
тут тоже все понятно - this указывает на текущий контекст, в данном случае - это глобальный контекст (window), а с двумя остальными то же, что и с двумя первыми. |
||||||||
|
|||||||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
AKS,
С одной стороны, оно так... но с другой стороны - свойство это содержит ссылку на сам объект, а т.к. в JS все объекты, кроме примитивных типов, являются ссылками (поправьте, если я в этом заблуждаюсь) - то это должна быть в точности та же самая ссылка, и в новых браузерах (FF, Op.9) это так и есть. Опять встает вопрос "кто же прав и почему". В данной теме все же интересует поведение верхнего окна. Опять же, следуя логике предыдущего пункта, top и self - принципиально разные свойства объекта window, почему же для верхнего окна они содержат одну и ту же ссылку (top===self)? А раз так, то что мешает каждому из них содержать честную ссылку на сам объект? Нет, что ни говорите, логика здесь какая-то странная. И наконец: какой логикой Вы объясните поведение 8-й Оперы, где глобальный контекст (this) не эквивалентен ни window, ни его свойствам-псевдонимам? -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| AKS |
|
||||||||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
SelenIT,
А какая-бы она ни была, все-таки ведь какая-то логика есть (она не может не есть ;) ). И ее нужно понять. Давайте опять с первого сравниения в IE:
Можно такое понять? А почему бы и нет! Можно предположить, что в IE есть явный глобальный объект window и есть еще window.window - св-во, указывающее на текущее окно браузера, и это не сосем одно и то же при строгом сравнении. А можно предположить, что это всего-навсего различия в работе оператора строго сравнения. Т.е., в FF при строгом сравнении один результат, а в IE - другой, и это как раз благодаря оператору строгого сравнения, которому удается "углядеть" какую-то разницу в IE.
Разными они будут во фрейме, а в одиночном окне указывают на текущее окно. Отсюда и результат, который одинаков во всех браузерах:
Объяснять я ничего не хотел бы, я ведь предложил дружно, так сказать, попытаться отыскать эту самую логику. Почему в Opera'х сначала было this===window, а теперь нет - видимо пошли по пути разработчиков IE... |
||||||||||
|
|||||||||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
AKS, по поводу IE в той теме трехлетней давности на Xpoint'е было предложено объяснение, которое кажется мне очень правдоподобным. Если так, то какой бы ни была исходная идея, реализована она все-таки глючно).
Извините, Вы, видимо, перепутали - это теперь все четыре ссылки (window, top, self и this) эквивалентны (как в FF), а в 8-й версии было что-то странное - ссылки на окно были эквивалентны между собой, но не совпадали с глобальным контекстом. Это сообщение отредактировал(а) SelenIT - 28.10.2006, 15:34 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| AKS |
|
||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
SelenIT,
А мне, вообще-то, нравится философия тех, кто обожает FF и не устает "бросать камни в огород" IE. Любое отличие от FF - "глюк"! PS На Xpoint я никакого объяснения не видел, если Вы, конечно, не считаете объяснением вот эту фразу: "Похоже, хороший косячок нарыли"... Добавлено @ 15:49 SelenIT, по большому счету, вот что есть в стандарте, касательно всех top&self&window.window:
|
||||
|
|||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
AKS, объяснением я посчитал это:
Глюком, соответственно - вторую часть этой фразы. И отличия от FF тут ни при чем. Вообще, хоть я и вправду обожаю FF и не собираюсь переходить с нее на 9-ю оперу (которая объективно как минимум не хуже), многое в "лисьих штучках" меня тоже порядком достает - например, то как она рендерит "настоящий" XHTML (только после полной загрузки кода, и в этот же момент происходит onload, а картинки как ни в чем ни бывало грузятся себе потом). Вообще, глюками всегда кажется непривычное поведение и отличия от злополучных "интуитивных представлений" о том, "как это должно быть". Побочный эффект этого - для человека, привыкшего к глюкам, глюком кажется "правильное" (с точки зрения стандартов) поведение. Впрочем, стандарты тоже пишут люди, так что субъективный фактор и тут не исключается... но это уже далеко уходящая в оффтоп общая философия:) |
|||
|
||||
| AKS |
|
||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
12345c, а нельзя ли выделить обсуждение св-в объекта window в отдельную тему? А то SelenIT напугал меня фразой:
, а я хотел бы еще "попереливать из пустого в порожнее" на эту тему. Или, может быть, можно прямо здесь? Кстати, у меня одинаково работает конструкция
с аргументами top.s и с s... |
||||
|
|||||
| AKS |
|
||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Zeroglif,
А я с некоторых пор (благодаря Вам) смотрю на это под таким углом зрения - IE6 сделан очень давно и в наши дни многое может казаться "глючным", но на самом деле не все так просто. Почитывая разные книжечки о программировании, я где-то встречал следующую концепцию: "Аналогично, но не идентично". Может и здесь что-то подобное?
Вообще-то в контексте моих сообщений это должно было выглядеть как-раз наоборот... |
||||
|
|||||
| AKS |
|
||||||||||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
У меня появились еще кое-какие соображения насчет "глюков" IE, хочется поделиться ими с собеседниками.
Начну с "равенства, но не тождественности двух объектов" (window & self). Может быть все же это не "промах", а как раз "злой умысел" разработчиков с целью лишить нас возможности писать в дочернем окне что-нибудь, типа:
? Ведь в таком случае понятно, почему window !=== top, так ведь? Может, конечно, возникнуть вопрос: "Почему я не могу писать top.onresize = function() {}?". Но, думаю, у разработчиков возник бы резонный встречный вопрос: "А почему бы не написать именно в окне верхнего уровня onresize = function() {}?" Продолжу уже примерами с Xpoint (куда SelenIT настойчиво предлагал обратиться за знаниями). Вот один "вариант глюка":
Оба предупреждения выдадут true, и это может кого-то удивить (и, в общем-то, удивило). Однако, удивление быстро пройдет, стоит только прочесть на MSDN Library следующую ремарку:
Т.е., хоть body и может "по-хозяйски" распорядиться методами "хозяина", отнюдь "тело" не будет caller'ом для перечисленных методов (и onload в частности). А вот самое интересное (тоже с Xpoint):
Можно связать это с предыдущим примером, предположив, что раз body "подменил на время" window, и хоть this==window, но не совсем window (this!==window). Но вот стоит только сохранить указатель на вызывающий объект в глобальной переменной:
, или передать параметром в функцию:
- результат будет противоположным. И вот здесь уже я объяснения пока не нахожу. Из примера, конечно же, видно, что дело в контексте выполнения, но еще не совсем все ясно. Конечно же, можно все это списать на "врожденную невнимательность и беспечное отношение к работе" со стороны разработчиков IE. И это было бы легче всего... |
||||||||||||
|
|||||||||||||
| AKS |
|
||||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Вот над этим:
долго думать не стал. "Потыкавшись" немного, решил, что объяснение - вот оно:
Ну и как вам, собеседники? Оказывается, окрыв страницу, IE создает window, но это "окно" не идентично тому, что будет после полной загрузки страницы. |
||||
|
|||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
AKS, а по-моему, объяснение в этом:
Функция-то не знает о глобальном объекте window - она тупо ищет переменную по scope chain и в итоге находит свойство глобального объекта с таким именем... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| AKS |
|
|||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
SelenIT,
А если так, то "кто там и что знает":
- без Zeroglif не разберешься... |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
AKS, признаю, поторопился. Новые факты явно в пользу Вашей версии. Подождем Zeroglifа...
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| AKS |
|
|||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
SelenIT,
продолжая пытать "преступника" IE, удалось выяснить следующее: 1 обращаясь к ключевому слову window в коде программы, мы получаем доступ к глобальному объекту; 2 обращась к ключевому слову window из документа (в аттрибутах тэгов, например), вместо глобального объекта мы получаем кое-что другое, а именно window.window, window.self, и т.д. Истину получим вот так:
Здесь ключевое слово this и есть глобальный объект, чье событие было "обработано", а window сами видите что такое (именно то, что разработчики "обозвали" Attributes/Properties). Ну и как Вам "глюки"? Согласитесь, для "глюков" все слишком закономерно... |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |