Общепознавательный пост, чтобы иметь под рукой пример решения с особенностями вызова.
Как известно, есть такая форма объявления объекта-функции.
| Код | 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 == событии |