Динамическая подмена функций

Обсуждение вопросов клиентского программирования.

Модератор: Duncon

Ответить
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Можно ли при помощи средств языка javascript на лету менять код функции?

Существует, например функция sum(a,b), которая даёт сумму.
Нужно при нажатии на ссылку на странице изменить фунциональность, чтобы она возвращала, например, произведение.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Oscar, не очень понятно что ты хочешь. Поставь другой обработчик на нажатие ссылки.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

AiK, функция уже написана. И мне нужно её использовать, иначе, кажется, нельзя.
Просто текст, генерирующий вызов этой функции - не мой, я не могу его изменить.

Что я хочу:
Есть переменная x=3; я могу заменить её на x=4; правильно?
Есть функция function sum(a,b){return a+b;} , я хочу её заменить на sum(a,b){return a*b;}
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Пройдёт ли, например такое присвоение?

sum={returm a*b;}
или
sum(a,b)={returm a*b;}
или ....
Тоесть .. не знаю.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Пройдёт такое: sum=anotherSum;

Где anotherSum - твоя функция.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

AiK, большое спасибо!
Кажется, это именно то, что мне было нужно.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Так, почти прекрасно, но что-то всё-таки не работает.

Если я из одного фрейма меняю функцию в parent, на функцию alert, например, то всё получается:

parent.window.myfunction=alert

Но если я хочу заменить на функцию в дочернем фрейме - выскакивает ошибка:

parent.window.myfunction=parent.window.frames[1].myfunction2 //Error

Я уж по разному пробовал:

top.document.all('frame2').myfunction2('hi')
window.parent.all.tags('frame')['frame2'].myfunction2('hi')
parent.frames.frame2.myfunction2('hi')
top.frames[1].myfunction2('hi')

Похоже проблема в том, что эта функция просто не вызывается даже из другого фрейма ((

А, вот ещё важный фактор! Страница во второй фрейм загружается не onLoad, а позже!
Может ли в этом состоять ошибка?
Если да - как же быть?
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Похоже запрещается использование JS-функций с другого сервера, или? Может кто-то знает что-то об этом вопросе?
Если я не прав - тогда почему с локального файла всё работает в следующем коде, а с удалённого - нет:



//index.html
//------------------
<script>
function test(str){
alert('index:'+str);
}
</script>
<frameset cols="*,*" border="1">
<frame src="1.html" name="left" frameborder="1">
<frame src="2.html" name="right" frameborder="1">
</frameset>
//------------------
//1.html
//------------------
<html>
<head></head>
<body>
<input type="button" value="Вызвать" onclick="parent.window.test('1')">

<input type="button" value="Сменить фрейм на другой на этом же сервере" onclick="parent.window.frames['right'].location.href='3.html'">
<input type="button" value="Сменить фрейм на другой на другом сервере" onclick="parent.window.frames['right'].location.href='http://home.informatik.tu-muenchen.de/~skrypnyo/3.html'">

<input type="button" value="Сменить функцию" onclick="parent.window.test=parent.window.frames['right'].my_test">

<input type="button" value="Проверить" onclick="parent.window.test('2')">
</body>
</html>
//------------------
//2.html
//------------------
//------------------
//3.html
//------------------
<script language="javascript">
function my_test(str){
alert('local: '+str);
}
</script>
Local
//------------------
//http://home.informatik.tu-muenchen.de/~skrypnyo/3.html
//------------------
<script language="javascript">
function my_test(str){
alert('remote: '+str);
}
</script>
Remote
//------------------
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Наверное таки JS с чужих серверов вызывать нельзя.
Зато работает следующая строчка:
function1=function function2(){alert('test')}

Но вот в Мозилле у меня получилось сделать то, что я хотел, а в IE не работает.
Может кто-то хоть литературу какую-нибудь про особенности динамического изменения функций в JS в разных бровзерах посоветует?
Ответить