Страница 1 из 1

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

Добавлено: 29 май 2004, 15:53
Oscar
Можно ли при помощи средств языка javascript на лету менять код функции?

Существует, например функция sum(a,b), которая даёт сумму.
Нужно при нажатии на ссылку на странице изменить фунциональность, чтобы она возвращала, например, произведение.

Добавлено: 29 май 2004, 16:07
AiK
Oscar, не очень понятно что ты хочешь. Поставь другой обработчик на нажатие ссылки.

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

Что я хочу:
Есть переменная x=3; я могу заменить её на x=4; правильно?
Есть функция function sum(a,b){return a+b;} , я хочу её заменить на sum(a,b){return a*b;}

Добавлено: 29 май 2004, 16:18
Oscar
Пройдёт ли, например такое присвоение?

sum={returm a*b;}
или
sum(a,b)={returm a*b;}
или ....
Тоесть .. не знаю.

Добавлено: 29 май 2004, 16:29
AiK
Пройдёт такое: sum=anotherSum;

Где anotherSum - твоя функция.

Добавлено: 29 май 2004, 16:30
Oscar
AiK, большое спасибо!
Кажется, это именно то, что мне было нужно.

Добавлено: 29 май 2004, 18:52
Oscar
Так, почти прекрасно, но что-то всё-таки не работает.

Если я из одного фрейма меняю функцию в 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, а позже!
Может ли в этом состоять ошибка?
Если да - как же быть?

Нашел я, похоже, ошибку. Поправте, если я не прав.

Добавлено: 30 май 2004, 18:50
Oscar
Похоже запрещается использование 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
//------------------

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

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