Как удалить событие, связанное с dojo, если у вас нет параметра & # 8220; handle & # 8221; что было возвращено во время dojo.connect?

StackOverflow https://stackoverflow.com/questions/1214624

  •  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 для этого виджета, будут заменены вашим новым обработчиком кликов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top