13

dojo.connect中に返された「ハンドル」がない場合、どのようにしてdojo接続イベントを削除しますか?

私の例では、一連のイベントを一連のオブジェクトに動的に割り当てます。(簡単にするために、イベントはonclickとondblclickであり、オブジェクトはテーブル内の行です)

したがって、ページ設定中、イベントは各行に接続されます(onclick、ondblclick)。現在、ユーザーの要望/アクションに応じて、1つの行から1つのイベントを削除する必要があります。ただし、元のハンドルは使用できなくなりました。このため、以下は機能しません dojo.disconnect(row, "onclick", ??*)。元の行構造をハッキングせずにこれを回避するにはどうすればよいですか?

もちろん、どんな助けでも大歓迎です。

4

5 に答える 5

10

あなたの質問に対する答えは、dojo.connect 操作中に返された「ハンドル」を失った場合、イベントを切断することは不可能であるということです。ただし、Dojo コード自体を大幅にハッキングする準備ができている場合は除きます。

後で切断する場合は、これらをどこかに保存する必要があります。

于 2011-01-12T16:47:05.730 に答える
9

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

セスと私のスケッチがあなたの場合に役立つかどうか見てください. そうでない場合は、詳細をお知らせください。

于 2009-08-01T01:05:15.600 に答える
8

私が通常行うことは、ハンドルを作成するときにハンドルを保存して、後で切断できるようにすることです。何かのようなもの:

 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には、これに関する同様のコード サンプルがあります。

于 2009-07-31T20:55:46.850 に答える
2

Dojo にはこれを行う方法がありませんが、標準の JavaScript を使用して名前付き関数を削除できます。

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

実際の動作はこちらでご覧ください。ただし、removeEventListener は Internet Explorer の IE9 でのみサポートされています。他のすべての主要なブラウザーで動作するはずです。

于 2013-04-16T04:02:18.970 に答える
0

イベントが Dijit ウィジェットに接続されている場合、次のようにイベントのすべてのハンドラーをオーバーライドできます。

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

そのウィジェットのハンドラーにアタッチされたすべての関数はclick、新しいクリック ハンドラーに置き換えられます。

于 2016-02-19T18:34:20.923 に答える