Подтвердить что ты не робот

Как удалить связанное событие dojo, если у вас нет "дескриптора", который был возвращен во время dojo.connect?

Как удалить связанное событие dojo, если у вас нет "дескриптора", который был возвращен во время dojo.connect?

Мой пример включает в себя динамическое назначение набора событий для набора объектов. (для простоты события имеют onclick и ondblclick, а объекты - это строки внутри таблицы)

Таким образом, во время событий настройки страницы подключаются к каждой строке (onclick, ondblclick). Теперь, в зависимости от пожеланий/действий пользователя, требуется удаление одного события из одной строки. Но оригинальная ручка больше недоступна. Из-за этого следующее не будет работать: dojo.disconnect(row, "onclick", ??*). Как мне обойти это без взлома исходной структуры строк?

Любая помощь, конечно, очень ценится.

4b9b3361

Ответ 1

То, что я обычно делаю, это сохранить ручки, когда я их создаю, поэтому я могу отключить их позже. Что-то вроде:

 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

Ответ 2

Ответ на ваш вопрос заключается в том, что невозможно отключить событие, если вы потеряли "дескриптор", который был возвращен во время операции dojo.connect. За исключением случаев, когда вы готовы сделать тяжелый взлом кода dojo.

Вы должны сохранить их где-нибудь, если вы хотите отключить их позже.

Ответ 3

Как и Seth, у меня есть мои шаблоны для удаления событий — Я собираю ручки в массивах (псевдокод):

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);

В вашем случае вы можете использовать словарь, как показано Seth, для достижения того же:

var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});

Итак, вы можете отключить обработчики следующим образом:

dojo.forEach(handles[node.id], dojo.disconnect);

Посмотрите, поможет ли Сет и мои эскизы в вашем случае. Если нет, сообщите нам подробнее.

Ответ 4

Даже если dojo не имеет способа сделать это, вы можете удалить именованную функцию со стандартным JavaScript:

node.removeEventListener ("click", clickFunction, false);

Смотрите здесь в действии. Однако removeEventListener поддерживается только как IE9 для Internet Explorer. Он должен работать на всех других основных браузерах.

Ответ 5

Если событие подключено к виджету Dijit, вы можете переопределить все обработчики в событии так:

dijit.byId(widgetid).onClick = function() {
    // click handler or empty function goes here
}

Любые функции, связанные с обработчиком click для этого виджета, будут заменены новым обработчиком кликов.