Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как узнать какие обработчики висят на элементе? (https://javascript.ru/forum/offtopic/37237-kak-uznat-kakie-obrabotchiki-visyat-na-ehlemente.html)

9xakep 12.04.2013 12:00

Как узнать какие обработчики висят на элементе?
 
<div id='test'>123</div>

<script>
	document.getElementById('test').addEventListener('click', function () {
		alert(this.innerHTML)
	}, false)
	
		document.getElementById('test').addEventListener('mouseout', function () {
		alert(this.innerHTML)
	}, false)

// Как получить эти обработчики?
</script>

devote 12.04.2013 12:34

http://javascript.ru/forum/events/28...-sobytijj.html

megaupload 12.04.2013 12:57

Нельзя это сделано для отсутствия конфликтов между скриптами, таким образом разные скрипты могут вешать свои листенеры о которых другие скрипты не будут знать и не смогут снять. кэп.

но КАЖДЫЙ скрипт МОЖЕТ снять свой листенер (если захочет) так как он может сохранить на него ссылку, комбокэп.


но разумеется ты можешь проксировать метод addEventListener заменив его в самом начале страницы на свой хакнутый)

Octane 12.04.2013 13:27

Цитата:

Сообщение от megaupload
…кэп…комбокэп…

http://www.w3.org/TR/2001/WD-DOM-Lev...ntListenerList
http://www.w3.org/TR/2002/WD-DOM-Lev...8/changes.html
http://lists.w3.org/Archives/Public/...8Apr/0066.html ;)
жаль нигде не реализовано

megaupload 12.04.2013 14:27

реализуй лол)

devote 12.04.2013 14:29

Цитата:

Сообщение от Octane
жаль нигде не реализовано

ну дык реализовать не проблема. понятно что не будет нативно.. Но возможности есть. Хотя со старыми ИЕ придется повозится.

9xakep 12.04.2013 15:42

Цитата:

Сообщение от megaupload

но разумеется ты можешь проксировать метод addEventListener заменив его в самом начале страницы на свой хакнутый)

лол
ты меня навел на мысль...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
</head>

<body>
<div id='test'>123</div>
<div id='res'></div>
<script>
var hash = {}
Element.prototype.addEvent = function (type, handler, bool) {
	
	var elem = this+'';
	
	if (!hash[elem]) {
		hash[elem] = {};
		hash[elem].index = 0;
	} else hash[elem].index++;
	
	
	if (!hash[elem].type) {
		hash[elem].type = {};
	}
	hash[elem].type[hash[elem].index] = type
	
	if (!hash[elem].handler) {
		hash[elem].handler = {}
	}
	hash[elem].handler[hash[elem].index] = ''+handler;
	
	
	if (this.addEventListener) {
			this.addEventListener(type, handler, bool);
	} else this.attachEvent('on' + type, handler);
	
}

Element.prototype.getEvents = function (id) {
	
	var elem = this+'';
	document.getElementById(id).innerHTML = 
	(function () {
		var result = '';
		for (i=0;i<=hash[elem].index;i++) {
			
			result += (i+1) +') <br> Type: '+ hash[elem].type[i];
			result += '<br> Handler: <br><pre>' + hash[elem].handler[i]
			result += '</pre><br>'
			
		}
		return result;
	}) ()
	
}

document.getElementById('test').addEvent('click', function () {
	alert(this.innerHTML)
}, false);

document.getElementById('test').addEvent('mouseout', function () {
	alert(this.innerHTML)
}, false);

document.getElementById('test').getEvents('res')

</script>
</body>
</html>


Кстати никто не знает как сохранить табуляцию?
<div id='res'></div>
<script>
var a = 'b	c	b';
alert(/\t/g.test(a)) // true, табы есть
res.innerHTML = a.replace(/\t/g,'   ');
</script>

===
Использовал тег <pre>

megaupload 12.04.2013 16:40

вообще-то события ишака фиксятся так

Element.prototype.addEventListener = Element.prototype.addEventListener ||
function(){
    alert('я ишак')
}


или Node не помню уже

9xakep 12.04.2013 21:54

megaupload,
я моем примере по-любому придется использовать другую функцию, иначе будет рекурсия (если я внутри addEventListener'a буду вызывать addEventListener)

Что означает проксировать функцию?

Aetae 12.04.2013 22:06

Цитата:

Сообщение от 9xakep (Сообщение 245864)
megaupload,
я моем примере по-любому придется использовать другую функцию, иначе будет рекурсия (если я внутри addEventListener'a буду вызывать addEventListener)

Что означает проксировать функцию?

addEventListenerOld = Element.prototype.addEventListener; //addEventListenerOld проксирует в себе addEventListener
Element.prototype.addEventListener = function(){
    //злобные хакерские действия
    addEventListenerOld.apply(this, [].slice.call(arguments))
}


Хотя нынче модно поступать так(используя замыкание):
Element.prototype.addEventListener = function(addEventListenerOld){
    return function(){
        //злобные хакерские действия
        addEventListenerOld.apply(this, [].slice.call(arguments))
    }
}(Element.prototype.addEventListener);


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