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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое определение функций обработчика прер. и просто динамич. опред. функций 
:(
    Опции темы
12345c
Дата 5.5.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


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

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



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

Как известно, есть такая форма объявления объекта-функции.
Код
aa=new Function('a' /*параметры*/, func);

Так можем задавать новое содержимое функции через текст. В применении к прерыванию это выглядит как обычный вызов меняющейся функции из дескриптора атрибута тега.
Код

<b>Динамическое определение функций</b><br>
<script>aa=function(){alert('Не определена');}    //пустая функция
function AssignEventHandler2(func){
    aa=new Function('a' /*параметр*/, func);
}
</script>
<br>
<a href=# onclick=AssignEventHandler2('alert(a*a*a);');return!1>Определить возведение в куб</a><br>
<a href=# onclick=AssignEventHandler2('alert(a*a);');return!1>Определить возведение в квадрат</a><br>
<a href=# onclick=aa(5);return!1>Выполнить с аргументом (параметром) 5</a><br>
Задача решена, но хочется менять обработчик, не прописывая атрибут в теге. Достаём из арсенала разработчика по паре методов разных калибров (IE, Gecko), делаем пробный выстрел. (Не работает в Опере 7.54)
Код
<b>Динамическое определение функций обработчика прерывания.</b><br>
<br>
<script>aa=function(){alert(0);}    //пустая функция
function AssignEventHandler(func){
    ia5=document.getElementById('a5');
    if (document.addEventListener) {
        ia5.removeEventListener("click",aa,true);
    aa=new Function("a=document.getElementById('i5').value;"+func);
        ia5.addEventListener("click",aa,true);
    } else if (document.attachEvent) {
        ia5.detachEvent("onclick", aa);
    aa=new Function("a=document.getElementById('i5').value;"+func);
        ia5.attachEvent("onclick", aa);
}}
onload=function(){ia5=document.getElementById('a5');if (document.addEventListener)ia5.addEventListener("click",aa,true);
}</script>
<a href=# onclick=AssignEventHandler('alert(a*a*a);');return!1>Определить возведение в куб</a><br>
<a href=# onclick=AssignEventHandler('alert(a*a);');return!1>Определить возведение в квадрат</a><br>
<a href=# id=a5>Выполнить с аргументом (параметром)</a> <input id=i5 size=7 value=5><br>
Здесь учтён ряд особенностей функционирования методов.
1) удалять обработчик перед присваиванием нового (почему-то) надо, причём, называя ту же функцию, c которой он был определён. Поэтому aa=new Function... всунуты между выключающим и назначающим методами.
2) В FF надо, прежде чем удалять, назначить обработчик, поэтому назначающий addEventListener() висит на onload - cj<snbb загрузки страницы. IE переносит первое мнимое удаление как-то без эксцессов.
3) Опера 7.54, хотя понимает addEventListener, как-то с ходу не берётся выполнять предложенный код и не замечает назначения (выводит # в адресе).

Во всём остальном - интересное упражнение, оставляющее резерв совершенствования и приручения Оперы.

Добавлено @ 18:50 
cj<snbb == событии 


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




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


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

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