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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Под каким объектом, всё-таки, работает javascript: ? 
:(
    Опции темы
12345c
Дата 27.10.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Выполняя

Код

<script>d=document
s='1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>22222'
</script>
<a href=javascript:frames.main.document.write(top.s+top.s+top.s);top.frames.main.document.close();>11111</a><br>
<a href=javascript:self.frames.main.document.write(top.s+top.s);top.frames.main.document.close();>22222</a><br>
<a href=javascript:top.frames.main.document.write(top.s);top.frames.main.document.close();>33333</a><br>
<script>
moz=!d.all;
function resize_iframe(){
 if(!moz) {
  //alert([frames['main'].document.body.scrollHeight,,]);
    d.getElementById('main1').height=frames['main'].document.body.scrollHeight;
 } else {
  //alert([frames['main'].document.height+20,,]);
    d.getElementById('main1').height=frames['main'].document.height+20;
}}
</script>
@@@
    <iframe name="main" id="main1" width='50%' onload="setTimeout(resize_iframe,1)" valign='top' src="" scrolling="no" frameborder="1"></iframe>@@@
эамечаем, что первый вариант написания не работает. С конструкцией "javascript:" регулярно обнаруживались странности в определении пространства имён. Неслучайно написаны в примере top.s , а не s - тоже давали неопределённость. В каком же окружении этот код выполняется?
PM WWW   Вверх
JSman
Дата 27.10.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



разумеется в том окружении, где написан сценарий. куда бы он не обращался, есть текущий объект window от которого и идет доступ к остальным объектам идет. я надеюсь, что правильно понял вопрос.
PM ICQ   Вверх
12345c
Дата 27.10.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: 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
PM WWW   Вверх
Nicholas_S
Дата 27.10.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



12345c, почему первый вариант не работает? Работает, как и следующие два. Пожалуйста, можешь чуть подробнее, что и где не работает?


--------------------
...все в мире относительно
PM   Вверх
12345c
Дата 27.10.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Да, точно, этот вариант сейчас везде работает, а особенность поведения в Опере-9 не в счёт - это обсуждается в соседней теме.
Значит, работать перестаёт, когда убираю где-либо "top." - перед s или перед другой переменной или объектом, если бы он употреблён. Например, стоит мне написать: javascript:alert(d);... - вылетает ошибка "d неопределён". javascript:alert(top.d);... - работает.

Добавлено @ 23:00 
(при этом ошибка или неошибка - везде)
PM WWW   Вверх
SelenIT
Дата 28.10.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



AKS, извините что напугал  smile фраза про оффтоп относилась исключительно к рассуждениям о глюках и привычках smile

По-моему, свойства объекта window вполне можно продолжить изучать прямо здесь, все-таки это имеет достаточно непосредственное отношение к теме.

Цитата(AKS @  28.10.2006,  19:59 Найти цитируемый пост)
Кстати, у меня одинаково работает конструкция...

И впрямь работает, в т.ч. в обеих моих Операх. Хотя это-как раз логично - "у людей" this===window и глобальная переменная доступна сразу, а "капризная северная красавица номер 8" находит переменную на конце scope chain... получается, что текущий контекст у нее лежит ниже контеуста window? Хм, уже результат... 


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


Опытный
**


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

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



Цитата(12345c @  27.10.2006,  20:52 Найти цитируемый пост)
Интересует практика - почему все браузеры дают ошибку, если напишем не top.s, а s - я выполняю его в топе.

Не должны выдавать (у меня так, во всяком случае), javascript prototcol, хоть и является вещью в себе, но свойства глобального объекта должен видеть легко. 

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

По логике EcmaScript не имеет значение, кто у кого свойство, кто кому принадлежит, только значение имеет значение (каламбурчик):

Код

var o = {};
o.p = o;
alert(o.p === o); //true, и там, и там ссылка на один объект


Значением window.self  теоретически должна быть ссылка на тот же самый объект, на который указывает ссылка (значение) самого window. По факту же IE может делать со своими host-овыми свойствами что угодно, они не обязаны быть равны/тождественны друг другу, и это будет конформно с точки зрения следованию закону (EcmaScript Conformance), а с точки зрения обычной логики - равенство, но не тождественность для двух таких объектов в такой ситуации выглядит глупо и является скорее всего всё-таки глюком IE (вряд ли это нужно было делать целенаправленно). Согласен с SelenIT по поводу глючной реализации.
Цитата(AKS @  28.10.2006,  15:45 Найти цитируемый пост)
А мне, вообще-то, нравится философия тех, кто обожает FF и не устает "бросать камни в огород" IE.

 smile Всё норовите обидеть мой любимый IE. Ну-ну...

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


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Цитата(AKS @  31.10.2006,  08:54 Найти цитируемый пост)
спасибо еще и за то, что не "зарезали" оффтоп!

а о чём беспокоиться? Исследования по теории никогда вредными не бывают.

А вопрос темы, вроде бы, не решён smile.
Почему в javascript: - протоколе работаем не в top и где на самом деле? Может быть, в window, но почему оно не top?

Дальнейший анализ показал, что пример из первого сообщения работает в parent, и причина тому - атрибут target. Если его убираем, необходимость в top. отпадает. Также можно проверить, оставив target и написав parent. .

Эффект неожиданный, потому что html не должен влиять на js. Но здесь, надо понимать, что происходит чередование вызовов html и js. Сначала клик на ссылке выполняет html, срабатывает target. Затем управление передаётся в js, при этом каким-то чудом считается, что target породил opener или parent (смотря куда показывает). Последнее иллюстрируется кодом в новой странице:
Код
<script>s=12345</script>
<a href=javascript:alert(opener.s) target=newPage>11111</a>
Правда, такого мнения не придерживается ни одна из Опер (в то время как про top. была (почти, см. ниже) согласна со всеми) и действительно, её js "честно не знает", откуда взялась html страница после html-управления, как и полагается.

Аналог с фреймом:
Код
<script>s=12345</script>
<a href=javascript:alert(parent.s) target=newPage>11111</a>
<iframe name=newPage width='50%' src="" frameborder="1"></iframe>
И что, как вы думаете, надо сделать, чтобы в Опере заработал? Убрать target!
PM WWW   Вверх
AKS
Дата 31.10.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



12345c,
Цитата

И что, как вы думаете, надо сделать, чтобы в Опере заработал? Убрать target! 
 
А я попробовал указать адрес в src, и Оперы тоже стали выдавать alert(parent.s)...
PM MAIL   Вверх
12345c
Дата 31.10.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: 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
PM WWW   Вверх
SelenIT
Дата 31.10.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



12345c, src="#" почему-то тоже работает, домен совпадает (хотя я боялся, что браузер уйдет в бескон. рекурсию и зависнет/вылетит).

Цитата(12345c @  31.10.2006,  18:31 Найти цитируемый пост)
отменяет действие на этапе "после target, но до js:

Почему?
Код

<script>s=12345</script>
<a href=javascript:alert(parent.s)||321 target=newPage>11111</a>
<iframe name=newPage width='50%' src="#" frameborder="1"></iframe>

вроде бы, штатно выводит результат JS-выражения в указанное место...


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


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Это равносильно повторению урл-а основной страницы, поэтому неудивительно. Рекурсии нет, потому что запускается по клику.
Почему Опера отменяет действие? Защита от кросс-скриптинга. Но FF в аналогичных случаях (не в этом) хотя бы выводит сообщение.
PM WWW   Вверх
SelenIT
Дата 31.10.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(12345c @  31.10.2006,  19:04 Найти цитируемый пост)
равносильно повторению урл-а основной страницы, поэтому неудивительно.

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

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

Это сообщение отредактировал(а) SelenIT - 31.10.2006, 21:26


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


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


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

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



Ой, теперь, кажется, до меня дошло - Вы говорили о случае несовпадения доменов, а я думал о случае их совпадения smile

А по поводу "решетки" мне подумалось, что ведь и в одном окне переход по "#" не загружает страницу по-новой, а лишь перемещает скроллинг вверх. Должно быть, и здесь страница грузится только один раз, потому iframe и пуст...

Это сообщение отредактировал(а) SelenIT - 31.10.2006, 21:25


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


Опытный
**


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

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



-----------------------------------------------------------------------
говоря по теме, 
Цитата(12345c @  27.10.2006,  20:07 Найти цитируемый пост)
    
<a href=javascript:frames.main.document.write(top.s+top.s+top.s);top.frames.main.document.close();>11111</a><br>    
<a href=javascript:self.frames.main.document.write(top.s+top.s);top.frames.main.document.close();>22222</a><br>    
<a href=javascript:top.frames.main.document.write(top.s);top.frames.main.document.close();>33333</a><br>

нужно сначало было бы воспользоваться document.open(); и у меня разом на ие все ошибки пропали при замене top.s -> s

window - это объект хоста, именно от него идут ссылки на другие объекты. именно по нему мы проверяем наличие объектов, функций в браузере. насчет объекта global - чушь. 

alert(window.RegExp).

самое интересное, в ие стоит запрет на присваивание нового значения к объекту хоста, даже при копии ссылки на него.

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


 




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


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

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