Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   АХТУН!!! Добавление, удаление событий кто поможет? (https://javascript.ru/forum/events/21906-akhtun-dobavlenie-udalenie-sobytijj-kto-pomozhet.html)

gordon freeman 29.09.2011 01:37

АХТУН!!! Добавление, удаление событий кто поможет?
 
Я прочитал статью
http://javascript.ru/tutorial/events/crossbrowser

но мой ясный ум не стал от нее яснее

кто мне поможет преобразовать этот код в ясный формат, сделать более подробный мануал и преподать жаждующим в разливном виде?

конечный результат должен выглядеть вот так вот
var e={
 cache:{},
 add:function() {
  //сюда
 },
 del:function() {
  //сюда
 }
};


в cache нужно сохранять добавленные элементы с их событиями

ну еще во из статьи event поменять бы на е:

впрочем это не так важно

есть кто не ленивый, трудолюбивый, с небольшим количеством гордости и стремления помочь?
:)

вот такой вот говнокод советовать не нужно :lol:

var addevent=function(obj, e, h) {
			if (obj.addEventListener) {
				obj.addEventListener(e, h, false);
			} else if (obj.attachEvent) {
				obj.attachEvent('on'+e, h);
			}
			else {
				obj['on'+e]=function() {
					h();
				};
			}
		}


Что вы поучите взамен если поможете с разжовыванием?

очень понятный фрейм ворк, (не смотря на jquery), возможность оценить который вы сможете только после просветления моего светлого ума :)
делал на одном дыхании и вдруг дыхание кончилось, подкиньте воздуха! :help:

da_ff 29.09.2011 11:01

А зачем кому-то может понадобиться "очень понятный фрейм ворк" от человека, который не может разобраться в статье?
И зачем просветлять ум, который и так "светлый"?

P.S. Поменьше слов, побольше кода с пометками что где непонятно.

melky 30.09.2011 09:54

задачу фигово поставили.

gordon freeman 05.10.2011 11:47

Проверьте пожалуйста код:
Переписал этот (сам код не менял, только стиль написания)
http://javascript.ru/files/event/event.js
Но он почемуто перестал работать в IE
Кто сможет обьяснить почему???
var $e={
		guid:0,
		fixEvent:function (event) {
			event = event || window.event;
			
			if(event.isFixed) {
				return event;
			}
			event.isFixed = true;
			
			event.preventDefault = event.preventDefault || function(){this.returnValue = false};
			event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true};
			
			if(!event.target) {
				event.target = event.srcElement;
			}
			
			if(!event.relatedTarget && event.fromElement) {
				event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
			}
			
			if(event.pageX == null && event.clientX != null) {
				var html = document.documentElement, body = document.body;
				event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
				event.pageY = event.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
			}
			
			if(!event.which && event.button) {
				event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
			}
			
			return event;
		},
		commonHandle:function (event) {
			event = _$$.$e.fixEvent(event);
			
			var handlers = this.events[event.type];
			
			for(var g in handlers) {
				var handler = handlers[g];
				
				var ret = handler.call(this, event);
				if(ret === false) {
					event.preventDefault();
					event.stopPropagation();
				}
			}
		},
		add:function(elem, type, handler) {
			if(elem.setInterval && (elem != window && !elem.frameElement)) {
				elem = window;
			}
			
			if(!handler.guid) {
				handler.guid = ++_$$.$e.guid;
			}
			
			if(!elem.events) {
				elem.events = {};
				elem.handle = function(event) {
					if(typeof Event !== "undefined") {
						return _$$.$e.commonHandle.call(elem, event);
					}
				}
			}
			
			if(!elem.events[type]) {
				elem.events[type] = {};
				
				if(elem.addEventListener) {
					elem.addEventListener(type, elem.handle, false);
				}
				else if(elem.attachEvent) {
					elem.attachEvent("on" + type, elem.handle);
				}
			}
			
			elem.events[type][handler.guid] = handler;
		},
		remove:function(elem, type, handler) {
			var handlers = elem.events && elem.events[type];
			
			if(!handlers) return;
			
			delete handlers[handler.guid];
			
			for(var any in handlers) {
				return;
			}
				if(elem.removeEventListener) {
					elem.removeEventListener(type, elem.handle, false);
				}
				else if(elem.detachEvent) {
					elem.detachEvent("on" + type, elem.handle);
				}
			
			delete elem.events[type];
			
			for(var any in elem.events) {
				return;
			}
				try {
					delete elem.handle;
					delete elem.events;
				}
				catch(e) {
					elem.removeAttribute("handle");
					elem.removeAttribute("events");
				}
		}
	}


Часовой пояс GMT +3, время: 00:17.