Indentificar função anônima
Boas?!
Então, venho aqui a pedir ideias sobre como identificar uma função anônima atribuída quando uma segunda função a declara.
Basicamente tenho 2 funções:
uma é chamada para adicionar o tipo de ação e qual função executar com o evento acionado.
outra obtem o tipo e a função para remover o evento no elemento.
on: function () {
var $type = arguments[0], $listener = arguments[1];
if (!$_.isDefined(this[0].eventListener)) {
this[0].eventListener = [];
}
this[0].eventListener.push({
type: $type,
listener: $listener
});
this[0].addEventListener($type, $listener, false);
},
off: function () {
var $type = arguments[0], $listener = arguments[1], $i = 0, $eventData = null;
if ($_.isDefined(this[0].eventListener)) {
for (; $i < this[0].eventListener.length; $i++) {
$eventData = this[0].eventListener[$i];
if ($type == $eventData.type && $listener == $eventData.listener) {
this[0].removeEventListener($eventData.type, $eventData.listener, false);
} else if ($type == $eventData.type) {
this[0].removeEventListener($eventData.type, $eventData.listener, false);
}
}
}
}
Perceba que para registrar e mais tarde saber qual função foi atribuída ao evento para remover eu armazenei os valores em um array.
E para remover apenas identifico se o argumento bate com os dados em algum índice do array.
Até então tudo bem.....
function adicionar() {
elemento.on('click', minhaFuncao);
}
function remover() {
elemento.off('click', minhaFuncao);
}
O probema está em funções anônimas quando declaradas dentro de outra função como isso:
function adicionar() {
elemento.on('click', function () {
// o que fazer....
});
}
Então até dar para identificar qual função a declarou, porém não dar para remover com removeEventListener pois essa função não é a ouvinte do elemento.
Obs.: Até poderia apagar a função ou "desaturbir sobre o alvo", no entanto não é viável pois pode haver que mais tarde ou outras condições dependam da função.
Até cheguei a solucionar "como quebra-galho":
Ao invés de atribuir a função recebida pelo argumento em "on" eu atribuo uma outra função pré definida, e essa função checa do array, se houver um índice onde o objeto é o mesmo tipo de evento e a função requisitada também existe no array, essa pré definida executa a função original.
Porém não é uma função real, e mais tarde se a pessoa quiser disparar a função digamos um click não pode a chamar seus atributos diretamente (porque seus atrinbutos não são dela e sim da pré definda), terá que chamar a função pré definida, pois é ela realmente a ouvinte.
Tornando alvo inviável para quem tem baixo ou menos intimidade com o javascript
Por fim até onde eu sei no javascript não há como manipular funções anônimas, por isso o que eu estou tentando fazer é inventar uma solução para algo que não existe.
Nota:
Nesse caso funciona pois não há uma outra função intermediária, mesmo que seja algo sem sentido de de fazer
exemplo.on('click', function (e) {
// o que fazer....
});
exemplo.off('click', function (e) {
// o que fazer....
});Discussão (2)
Carregando comentários...