Как удалить событие, связанное с dojo, если у вас нет «дескриптора», который был возвращен во время dojo.connect? - PullRequest
13 голосов
/ 01 августа 2009

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 12 января 2011

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

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

9 голосов
/ 01 августа 2009

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

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

Посмотрите, помогут ли Сет и мои зарисовки в вашем случае. Если нет, дайте нам больше деталей.

8 голосов
/ 01 августа 2009

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

 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 голосов
/ 16 апреля 2013

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

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

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

0 голосов
/ 19 февраля 2016

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

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

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

...