Как узнать какие обработчики висят на элементе?
<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>
|
|
Нельзя это сделано для отсутствия конфликтов между скриптами, таким образом разные скрипты могут вешать свои листенеры о которых другие скрипты не будут знать и не смогут снять. кэп.
но КАЖДЫЙ скрипт МОЖЕТ снять свой листенер (если захочет) так как он может сохранить на него ссылку, комбокэп. но разумеется ты можешь проксировать метод addEventListener заменив его в самом начале страницы на свой хакнутый) |
Цитата:
http://www.w3.org/TR/2002/WD-DOM-Lev...8/changes.html http://lists.w3.org/Archives/Public/...8Apr/0066.html ;) жаль нигде не реализовано |
реализуй лол)
|
Цитата:
|
Цитата:
ты меня навел на мысль...
<!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> |
вообще-то события ишака фиксятся так
Element.prototype.addEventListener = Element.prototype.addEventListener ||
function(){
alert('я ишак')
}
или Node не помню уже |
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, время: 13:24. |