|
|
|
| Здравствуйте столкнулся вот с какой проблеммой:
<B id=qqq onmousedown="alert('down')">qqq</B><br>
<SCRIPT LANGUAGE="JavaScript">
<!--
qqq.onmouseup=function () {alert('up');}
alert(qqq.onmouseup)
alert(qqq.onmousedown)
www=qqq.cloneNode(1);
alert(www.onmouseup)
alert(www.onmousedown)
document.body.appendChild(www)
//-->
</SCRIPT>
Все браузеры кричат что в клонированном ноде нету onmouseup - меня это очень смущает и еще больше раздражает, требуеться цивилизованный вариант исправлений, зарание спасибо. | |
|
|
|
|
|
|
|
для: dimon.st
(24.07.2006 в 18:44)
| | Обратитесь с вопросом на http://forum.vingrad.ru/ , rsdn.ru или http://xpoint.ru/forums/programming/javascript/misc/forum.xhtml - нужны более искушённые специалисты. Могу посоветовать innerHTML, но это не метод.
И
<B id=qqq onmousedown="alert('down')">qqq</B><br>
<script>
qqq.setAttribute("onmouseup1",Function("alert('up');"));
alert(qqq.onmouseup1)
alert(qqq.onmousedown)
www=qqq.cloneNode(1);
alert(www.getAttribute('onmouseup1'))
alert(www.onmousedown)
document.body.appendChild(www)
</script>
| работает. | |
|
|
|
|
|
|
|
для: 12345
(24.07.2006 в 23:03)
| | решил не обращаться за помощью на др форума, а подумать своей головой:
<B id=qqq onmousedown="alert(-1)">q<I onmousedown="alert(999)">q</I>q</B><BR>
|
add_handler=function (obj, ev, func)
{
if (!obj.handler_stack) {obj.handler_stack={};}
if (!obj.handler_stack[ev]) {
obj.handler_stack[ev]=[];
if (obj[ev]) {obj.handler_stack[ev][0]=obj[ev];}
obj[ev]=function (e) {var ret; for (var i=0; i<obj.handler_stack[ev].length; i++) {ret=obj.handler_stack[ev][i](e);} return ret;}
}
obj.handler_stack[ev][obj.handler_stack[ev].length]=func;
}
restart_handler=function (obj,from)
{
obj.handler_stack={};
for(var ev in from.handler_stack) {
obj.handler_stack[ev]=[]; for (var i=0; i<from.handler_stack[ev].length; i++) {obj.handler_stack[ev][i]=from.handler_stack[ev][i];}
obj[ev]=(function (ev) {return function (e) {var ret; for (var i=0; i<obj.handler_stack[ev].length; i++) {ret=obj.handler_stack[ev][i](e);} return ret;}})(ev);
}
for(var n in obj.childNodes) {if (obj.childNodes[n].nodeType==1) {restart_handler(obj.childNodes[n],from.childNodes[n]);}}
}
remove_handler=function (obj, ev, func)
{
if (obj.handler_stack)
if (obj.handler_stack[ev]) {
for (var i=0; i<obj.handler_stack[ev].length; i++) {if (obj.handler_stack[ev][i]==func) {obj.handler_stack[ev].splice(i, 1); return;}}
}
}
|
Здесь мы имеем назначение событий add_handler удаление событий remove_handler и обновление событий (после клонирования например) restart_handler
Пример использования:
fff=function () {alert(1)} // объявление функции
sys.add_handler(qqq,'onmousedown',function () {alert(0)}); //добавление события на нажатие
sys.add_handler(qqq,'onmousedown',fff); // добавление ране объявленной функции на нажатие
sys.add_handler(qqq,'onmousemove',function () {status+=1}); // добавление на движение (status только в осле)
www=qqq.cloneNode(1); //клонирование нода
www.id='www' // переназначение индификатора (для возможности обращение к qqq)
sys.restart_handler(www,qqq); //обновление событий точнее перезадача относительно клонируемого объекта
document.body.appendChild(www)
sys.remove_handler(www,'onmousedown',fff); //удаление одной из функций у клонированного объекта на нажатие
Плюсы:
1. возможность назначения нескольких обработчиков событий с последующим их удалением
2. возможность восстановить события у клонированного нода
Минусы:
1. навязывание использования remove_handler/add_handler, некрасивость метода
2. рекурсия при восстановлении
Буду рад если кому-нибудь понадобиться, также с удовольствием выслушую идеи доработки .. | |
|
|
|