Динамическая подмена функций
Модератор: Duncon
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
Можно ли при помощи средств языка javascript на лету менять код функции?
Существует, например функция sum(a,b), которая даёт сумму.
Нужно при нажатии на ссылку на странице изменить фунциональность, чтобы она возвращала, например, произведение.
Существует, например функция sum(a,b), которая даёт сумму.
Нужно при нажатии на ссылку на странице изменить фунциональность, чтобы она возвращала, например, произведение.
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;}
Просто текст, генерирующий вызов этой функции - не мой, я не могу его изменить.
Что я хочу:
Есть переменная x=3; я могу заменить её на x=4; правильно?
Есть функция function sum(a,b){return a+b;} , я хочу её заменить на sum(a,b){return a*b;}
Пройдёт такое: sum=anotherSum;
Где anotherSum - твоя функция.
Где anotherSum - твоя функция.
Даже самый дурацкий замысел можно воплотить мастерски
- 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, а позже!
Может ли в этом состоять ошибка?
Если да - как же быть?
Если я из одного фрейма меняю функцию в 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
//------------------
Если я не прав - тогда почему с локального файла всё работает в следующем коде, а с удалённого - нет:
//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 в разных бровзерах посоветует?
Зато работает следующая строчка:
function1=function function2(){alert('test')}
Но вот в Мозилле у меня получилось сделать то, что я хотел, а в IE не работает.
Может кто-то хоть литературу какую-нибудь про особенности динамического изменения функций в JS в разных бровзерах посоветует?