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

Поиск:

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


 




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


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

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