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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Теряется ссылка на js-функцию в iframe 
:(
    Опции темы
lazabt
Дата 22.8.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может быть кто сталкивался с такой проблемой...
В iframe подгружается html с javascript'ом (document.write("<script src...")).
После загрузки происходит присвоение ссылок на js-функции iframe'а родительскому окну:
из iframe: parent.foo = window.foo
Т.е. из родительского окна теперь можно спокойно делать вызов foo(), вместо frames["ifr"].foo().

НО, после загрузки следующего html в этот же iframe, ссылка на foo в родительском окне ТЕРЯЕТСЯ. Т.е. переменная window.foo существует и даже foo.toString() выдает тело функции, а вот вызов window.foo() приводит к ошибке.

Не понятно, почему такое происходит, ведь при удалении iframe.foo, интерпретатор js должен был посмотреть на RefCount ссылки foo и увидеть, что есть еще и window.foo, и отменить удаление. 

В FF работает, в IE6 именно такое поведение. А на самом деле мне нужно реализовать это для ANT Fresco.

Интересно, что для других js-объектов (Object, Array и т.д.), отличных от Function все работает, хотя они тоже должны копироваться по ссылке (не по значению).

Вот пример:
Браузер: IE6.
При нажатии include1 должен вывести foo1 (так и есть), при последующем нажатии include2 должен вывести foo1, foo2, а выводит только foo2, т.к. ссылка на foo1 потеряна 

test.html 
Код

<html>
<script language="javascript">
function btnClick(src) { 
  frm.action = src;
  frm.submit();
  window.setTimeout(print, 100);
}

function print() {
  try {
    foo1(); 
  } 
  catch(e) {} 
  try { 
    foo2(); 
  } 
  catch(e) {} 
}
</script>
<body> 
<input type="button" value="include 1" onclick="btnClick('fr1.html')" /> 
<input type="button" value="include 2" onclick="btnClick('fr2.html')" /> 
<form name="frm" target="ifr" method="post" action=""> 
</form> 
<iframe name="ifr" src=""></iframe> 
</body> 
</html>


fr1.html 
Код

<html> 
<head> 
<script> 
function foo1() { 
  alert("foo1"); 
}

function init() { 
  parent.foo1 = foo1; 
} 
</script> 
</head> 
<body onload="init()"> 
</body> 
</html> 


fr2.html 
Код

<html> 
<head> 
<script> 
function foo2() { 
  alert("foo2"); 
}

function init() { 
  parent.foo2 = foo2; 
}
</script>
</head>
<body onload="init()">
</body>
</html>

PM MAIL   Вверх
vasac
Дата 22.8.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата(lazabt @  22.8.2006,  12:06 Найти цитируемый пост)
Не понятно, почему такое происходит, ведь при удалении iframe.foo, интерпретатор js должен был посмотреть на RefCount ссылки foo и увидеть, что есть еще и window.foo, и отменить удаление.

ИМХО не факт, так как эти foo находятся в различных документах. По-моему здесь уже многое зависит от реализации в браузере.
Так же возникает множество других вопросов, типа, а в каком контексте должна выполняться foo1, после перезагрузки фрейма.
Что за задача то? Скорее всего это можно решить подругому.
PM WWW   Вверх
lazabt
Дата 22.8.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, пожалуй, все не так уж и прозрачно, как кажется на первый взгляд...
Кстати, интересно, что если сохранить тело функции в строке (http://www.irt.org/script/1234.htm) и создать при помощи конструктора новую функцию:
Код

...
parent.foo1 = new Function(foo1Body);

то эффект все-равно тот же.


Задача простая: загрузить в динамике javascript-файл
Код

<script>
inlcude("file.js")
</script>

в ANT Fresco-браузере (держит только DOM0). Естественно, никакие там AJAX-ы не работают.
При этом document.write("<script...") тоже не подходит, т.к. include'ить приходится в разных местах документа, в т.ч. и по событию (например, нажали кнопку - загрузился скрипт, приложение продолжило выполнение).

Я пытался решить задачу через фрейм-loader, в который передается имя js-файла. Фрейм делает внутри себя при загрузке document.write("<script ..."). Дальше я хотел контекст фрейма скопировать в главное окно. Не получилось  smile 

Это сообщение отредактировал(а) lazabt - 22.8.2006, 14:27
PM MAIL   Вверх
vasac
Дата 22.8.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Инклюд так делается:
Код

var s = document.createElement( "script" );
s.setAttribute( "src", <путь, соответственно> );
s.setAttribute( "type", "text/javascript" );
document.body.appendChild( s );


Дальше осталось только поймать момент полной загрузки.
В Gecko это делается просто через onload.
В IE нужно ловить onreadystatechange и отслеживать статус загрузки.
Самый же надежный способ — поставить в конце загружаемой либы вызов нужной функции.
PM WWW   Вверх
lazabt
Дата 22.8.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



К сожалению fresco не поддерживает DOM-модель (DOM level 0 =  Internet Explorer и Netscape до 4 версии).
Максимум, что можно делать - document.write
PM MAIL   Вверх
vasac
Дата 22.8.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата(lazabt @  22.8.2006,  14:12 Найти цитируемый пост)
parent.foo1 = new Function(foo1Body);

Что если в основной документ передавать имя функции и ее тело?

В основном:
Код

function makeFunction( name, body ) {
  window[ name ] = new Function( body );
}


В подключаемом:
Код

parent.makeFunction( "foo1", "alert('foo1')" );

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


 




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


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

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