![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Выполняя
|
|||
|
||||
| JSman |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 279 Регистрация: 10.7.2006 Репутация: нет Всего: 4 |
разумеется в том окружении, где написан сценарий. куда бы он не обращался, есть текущий объект window от которого и идет доступ к остальным объектам идет. я надеюсь, что правильно понял вопрос.
|
|||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Интересует практика - почему все браузеры дают ошибку, если напишем не top.s, а s - я выполняю его в топе. И ошибка, заложенная в верхнем примере на 1-й ссылке - тоже "достигается" везде. Это явно не случайно - все разработчики бр-ров следуют какой-то логике, создавая эти ошибки.
(В то же время, запустив скрипт по onсlick=....;return!1 , получим совершенно понятное и логичное окружение - объект window (равный здесь объекту top). И ошибок не будет. Вот чтобы не гадать, что же за окружение для "javascript:", хотелось бы, наконец, разобраться.) Это сообщение отредактировал(а) 12345c - 27.10.2006, 20:53 |
|||
|
||||
| Nicholas_S |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 486 Регистрация: 12.10.2006 Где: Санкт-Петербург Репутация: 5 Всего: 19 |
12345c, почему первый вариант не работает? Работает, как и следующие два. Пожалуйста, можешь чуть подробнее, что и где не работает?
-------------------- ...все в мире относительно |
|||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Да, точно, этот вариант сейчас везде работает, а особенность поведения в Опере-9 не в счёт - это обсуждается в соседней теме.
Значит, работать перестаёт, когда убираю где-либо "top." - перед s или перед другой переменной или объектом, если бы он употреблён. Например, стоит мне написать: javascript:alert(d);... - вылетает ошибка "d неопределён". javascript:alert(top.d);... - работает. Добавлено @ 23:00 (при этом ошибка или неошибка - везде) |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
AKS, извините что напугал
По-моему, свойства объекта window вполне можно продолжить изучать прямо здесь, все-таки это имеет достаточно непосредственное отношение к теме. И впрямь работает, в т.ч. в обеих моих Операх. Хотя это-как раз логично - "у людей" this===window и глобальная переменная доступна сразу, а "капризная северная красавица номер 8" находит переменную на конце scope chain... получается, что текущий контекст у нее лежит ниже контеуста window? Хм, уже результат... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| Zeroglif |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Не должны выдавать (у меня так, во всяком случае), javascript prototcol, хоть и является вещью в себе, но свойства глобального объекта должен видеть легко.
По логике EcmaScript не имеет значение, кто у кого свойство, кто кому принадлежит, только значение имеет значение (каламбурчик):
Значением window.self теоретически должна быть ссылка на тот же самый объект, на который указывает ссылка (значение) самого window. По факту же IE может делать со своими host-овыми свойствами что угодно, они не обязаны быть равны/тождественны друг другу, и это будет конформно с точки зрения следованию закону (EcmaScript Conformance), а с точки зрения обычной логики - равенство, но не тождественность для двух таких объектов в такой ситуации выглядит глупо и является скорее всего всё-таки глюком IE (вряд ли это нужно было делать целенаправленно). Согласен с SelenIT по поводу глючной реализации.
|
||||||||
|
|||||||||
| 12345c |
|
||||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
а о чём беспокоиться? Исследования по теории никогда вредными не бывают. А вопрос темы, вроде бы, не решён Почему в javascript: - протоколе работаем не в top и где на самом деле? Может быть, в window, но почему оно не top? Дальнейший анализ показал, что пример из первого сообщения работает в parent, и причина тому - атрибут target. Если его убираем, необходимость в top. отпадает. Также можно проверить, оставив target и написав parent. . Эффект неожиданный, потому что html не должен влиять на js. Но здесь, надо понимать, что происходит чередование вызовов html и js. Сначала клик на ссылке выполняет html, срабатывает target. Затем управление передаётся в js, при этом каким-то чудом считается, что target породил opener или parent (смотря куда показывает). Последнее иллюстрируется кодом в новой странице:
Аналог с фреймом:
|
||||
|
|||||
| AKS |
|
|||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
12345c,
А я попробовал указать адрес в src, и Оперы тоже стали выдавать alert(parent.s)... |
|||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Ага, значит, считает, что чужой домен, но нигде об этом не говорит.
Написал src="javascript:document.write(123);document.close()" - не работает; src="http://js2.ru" - не работает; src="zzzz41.htm" - работает, если есть такая страница в папке (на "своём хосте", точнее, в локальном окружении file://localhost/); Добавлено @ 18:33 (и отменяет действие на этапе "после target, но до js:") Это сообщение отредактировал(а) 12345c - 3.3.2008, 13:34 -------------------- Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
12345c, src="#" почему-то тоже работает, домен совпадает (хотя я боялся, что браузер уйдет в бескон. рекурсию и зависнет/вылетит).
Почему?
вроде бы, штатно выводит результат JS-выражения в указанное место... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Это равносильно повторению урл-а основной страницы, поэтому неудивительно. Рекурсии нет, потому что запускается по клику.
Почему Опера отменяет действие? Защита от кросс-скриптинга. Но FF в аналогичных случаях (не в этом) хотя бы выводит сообщение. |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
По-моему, наоборот удивительно! Адрес ведь стоит в src изначально, поэтому зацикливание должно было бы произойти сразу после загрузки (но не происходит, а iframe визуально остается пустым - причем, кажется, во всех браузерах). А где Опера отменяет действие, я пока так и не увидел - наоборот, результат предыдущего примера я истолковал как свидетельство того, что она доводит его до конца... - сорри, был мой глюк. Это сообщение отредактировал(а) SelenIT - 31.10.2006, 21:26 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
Ой, теперь, кажется, до меня дошло - Вы говорили о случае несовпадения доменов, а я думал о случае их совпадения
А по поводу "решетки" мне подумалось, что ведь и в одном окне переход по "#" не загружает страницу по-новой, а лишь перемещает скроллинг вверх. Должно быть, и здесь страница грузится только один раз, потому iframe и пуст... Это сообщение отредактировал(а) SelenIT - 31.10.2006, 21:25 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| JSman |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 279 Регистрация: 10.7.2006 Репутация: нет Всего: 4 |
-----------------------------------------------------------------------
говоря по теме, нужно сначало было бы воспользоваться document.open(); и у меня разом на ие все ошибки пропали при замене top.s -> s window - это объект хоста, именно от него идут ссылки на другие объекты. именно по нему мы проверяем наличие объектов, функций в браузере. насчет объекта global - чушь. alert(window.RegExp). самое интересное, в ие стоит запрет на присваивание нового значения к объекту хоста, даже при копии ссылки на него. |
|||
|
||||
| Zeroglif |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
||||
|
||||
| JSman |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 279 Регистрация: 10.7.2006 Репутация: нет Всего: 4 |
Global - не прикладной объект, хоть по теории является "папой" всех объектов, в коде его указать нельзя - не видим, а проверку объектов или функций, переменных осуществляем через window
|
|||
|
||||
| Zeroglif |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Ключевое слово this в определённой ситуации должно вычисляться в глобальный объект. То есть this суть Global в глобальном контексте:
или в функции:
В этом случае мы уже можем проверять переменную через this.переменная, а значит никаких хостовых штучек в синтаксисе не потребуется, pure EcmaScript, так сказать. |
||||||
|
|||||||
| JSman |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 279 Регистрация: 10.7.2006 Репутация: нет Всего: 4 |
||||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |