dojo: какие события прикреплены к элементу? - PullRequest
2 голосов
/ 24 мая 2011

Как я могу получить все события, связанные с элементом с dojo ?

dojo.query('#mydiv') // which events does #mydiv has?

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Чтобы получить все события для элемента DOM:

// Get my div
myDiv = dojo.byId("myDiv");
// Obtain all event-related attributes
var events = dojo.filter(
    myDiv.attributes, 
    function(item) { 
        return item.name.substr(0, 2) == 'on';
    }
);
// Execute first found event, just for fun
eval(events[0].value);

Если вы получаете myDiv с использованием dojo.query, помните, что dojo.query возвращает массив, поэтому ваш элемент будет в myDiv [0].

Это решение не работает с событиями, связанными с dojo.connect.Вероятно, есть способ извлечь эту информацию из внутренней работы Dojo, но вам придется углубиться в исходный код, чтобы понять, как это сделать.

Другой вариант - вы явно управляете всеми событиями dojo.connect с помощью глобального реестра.,Вы можете использовать dojox.collections, чтобы сделать это проще.Например, создание глобального реестра, ключами которого будут узлы dom, а значениями будут дескрипторы, возвращаемые dojo.connect (эти дескрипторы содержат узел dom, тип события и функцию для выполнения):

// On startup
dojo.require(dojox.collections.Dictionary);
eventRegistry = new dojox.collections.Dictionary();
...
// Registering an event for dom node with id=myDiv
var handle1 = dojo.connect(dojo.byId("myDiv"), "onclick", null, "clickHandler");
// Check if event container (e.g. an array) for this dom node is already created
var domNode = handle1[0];
if (!eventRegistry.containsKey(domNode))
    eventRegistry.add(domNode, new Array());
eventRegistry.item(domNode).push(handle1);
...
// Add another event later to myDiv, assume container (array) is already created
var handle2 = dojo.connect(dojo.byId("myDiv"), "onmouseover", null, "mouseHandler");
eventRegistry.item(domNode).push(handle2);
...
// Later get all events attached to myDiv, and print event names
allEvents = eventRegistry.item(domNode);
dojo.forEach(
    allEvents, 
    function(item) {
        console.log(item[1]); 
       // Item is the handler returned by dojo.connect, item[1] is the name of the event!
    }
);

Вы можете скрыть надоедливую проверку, чтобы увидеть, создан ли контейнер событий, создав подкласс dojox.collections.Dictionary с уже включенной этой проверкой.Создайте файл js с этим путем fakenmc / EventRegistry.js и поместите его рядом с dojo, dojox и т. Д.:

dojo.provide('fakenmc.EventRegistry');
dojo.require('dojox.collections.Dictionary');
dojo.declare('fakenmc.EventRegistry', dojox.collections.Dictionary, {
    addEventToNode : function(djConnHandle) {
        domNode = djConnHandle[0];
        if (!this.containsKey(domNode))
            this.add(domNode, new Array());
        this.item(domNode).push(djConnHandle);
    }
});

Используя вышеупомянутый класс, вам потребуется dojo.require ('fakenmc.EventRegistry')вместо 'dojox.collections.Dictionary' и просто добавит дескриптор подключения dojo без других проверок:

dojo.provide('fakenmc.EventRegistry');
eventRegistry = new fakenmc.EventRegistry();
var handle = dojo.connect(dojo.byId("myDiv"), "onclick", null, "clickHandler");
eventRegistry.addEventToNode(handle);
...
// Get all events attached to node
var allEvents = eventRegistry.item(dojo.byId("myDiv"));
...

Этот код не тестировался, но я думаю, вы поняли.

1 голос
/ 20 ноября 2013

Если это только для целей отладки.Вы можете попробовать dijit.byId("myId").onClick.toString(); в консоли Firebug и увидеть весь код onclick, это работает, даже если функция анонимная, вы можете просматривать содержимое анонимного содержимого.

...