Как удалить событие, связанное с dojo, если у вас нет параметра & # 8220; handle & # 8221; что было возвращено во время dojo.connect?
-
06-07-2019 - |
Вопрос
Как удалить событие, связанное с dojo, если у вас нет " handle " что было возвращено во время dojo.connect?
Мой пример включает динамическое назначение набора событий для набора объектов. (для простоты события - это onclick и ondblclick, а объекты - это строки в таблице)
Итак, во время настройки страницы события связаны с каждой строкой (onclick, ondblclick). Теперь, в зависимости от желаний / действий пользователя, требуется удаление одного события из одной строки. Но оригинальная ручка больше не доступна. По этой причине следующее не будет работать: dojo.disconnect (row, " onclick " ;, ?? *)
. Как мне обойти это без взлома исходной структуры строк?
Любая помощь, конечно, очень ценится.
Решение
Обычно я сохраняю маркеры при их создании, чтобы потом их можно было отключить. Что-то вроде:
var connects = {};
// then later on
var node = dojo.create(....); // or someting else that gives you a node
dojo.forEach( ['click','ondblclick' ], function( evt, idx ) {
if (!connects[node.id]) {
connects[node.id] = [];
}
connects[ node.id ][idx] = dojo.connect( node, evt, function(evt) { .... });
});
Затем, позже, вы можете отключиться как:
dojo.forEach( connects[node.id], function( handle ) {
dojo.disconnect( handle );
});
Для этого есть похожий пример кода на dojocampus
Другие советы
Ответ на ваш вопрос заключается в том, что невозможно отключить событие, если вы потеряли " ручку " который был возвращен во время операции dojo.connect. За исключением случаев, когда вы готовы взломать сам код додзё.
Вы должны хранить их где-нибудь, если хотите отключить их позже.
Как и у Сета, у меня есть шаблоны для удаления событий & # 8212; Я собираю маркеры в массивах (псевдокод):
var handles = [
dojo.connect(...),
dojo.connect(...),
dojo.connect(...)
];
Если я подключаюсь динамически, я просто собираю их:
var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));
Если я регулярно соединяю несколько событий, я могу использовать dojo.map ()
:
var handles = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
Изящная часть в том, что позже я смогу отключить их все с помощью удобной однострочной:
dojo.forEach(handles, dojo.disconnect);
В вашем случае вы можете использовать словарь, показанный Сетом, чтобы выполнить то же самое:
var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
Итак, позже вы можете отключить обработчики следующим образом:
dojo.forEach(handles[node.id], dojo.disconnect);
Посмотрите, помогут ли Сет и мои зарисовки в вашем случае. Если нет, дайте нам больше деталей.
Даже если у dojo нет способа сделать это, вы можете удалить именованную функцию стандартным JavaScript:
node.removeEventListener ("click", clickFunction, false);
Смотрите его в действии здесь . Однако removeEventListener поддерживается только в IE9 для Internet Explorer. Он должен работать во всех других основных браузерах.
Если событие связано с виджетом Dijit, вы можете переопределить все обработчики этого события следующим образом:
dijit.byId(widgetid).onClick = function() {
// click handler or empty function goes here
}
Любые и все функции, прикрепленные к обработчику click
для этого виджета, будут заменены вашим новым обработчиком кликов.