3

私はマウスイベントの知識を向上させようとしているので、この質問は、ドラッグアンドドロップモジュールを使用できるかどうかよりも、私が行っていることがうまくいかない理由についてです。

Dojoを使用していて、mousedownイベントとmouseupイベントに接続しました。右クリックではないmousedownイベントがある場合、mousemoveの接続を設定します。後続のmouseupイベントで、そのイベントを切断します。コードは次のようになります。EDIT(自己完結型の例にする必要があります)

obj = {

    init: function(){
        var c;
        dojo.connect(dojo.doc, "mousedown", this, function(evt){
            this.down(evt);
            if(evt.button != dojo.mouseButtons.RIGHT){
                this._isDown = true;
                c = dojo.connect(dojo.doc, "mousemove", this, "drag");
            }
        });
        dojo.connect(dojo.doc, "mouseup", this, function(evt){
            dojo.disconnect(c);

            this._isDown = false;
            this.up(evt);
        });
    },//end init

    drag: function(evt){
        console.log("Mouse drag",evt);
    },

    up: function(evt){
        console.log("Mouse up",evt);
    },

    down: function(evt){
        console.log("Mouse down",evt);
    }
}//end obj

編集:これを試すには、コンソールを使用して任意のページ(imgを使用)にdojoを挿入し、このobjを作成してobj.init()を実行します。1.5で注入:

document.documentElement.firstChild
    .appendChild(document.createElement("script"))
    .src='http://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js';

それは私には対称に見え、ドキュメントの大部分をクリックすると正常に機能します。ただし、アイコンをクリックしてドラッグすると、「ドラッグ」関数が1回だけ呼び出され(接続によって呼び出されるはずなので、カーソルを動かすたびに呼び出されます)、マウスを離してもmouseupイベントは呼び出されません。 。

次にマウスダウンすると、cが新しい接続で上書きされ、前の接続を切断できないようになります。したがって、ドラッグでのみアクティブにすることを意図していたものが永続的なイベントになります。

私が実装した悪い解決策は、「マウスダウン」接続で接続する前に切断することです。これにより、「ドラッグ」への永続的な呼び出しが発生しないようになりますが、もう一度クリックして設定を解除するまで、「ドラッグ」への不正な呼び出しが残ります。

なぜこれが起こっているのかについてのヒントはありますか?

4

2 に答える 2

1

私は最近問題に遭遇しました。これはfocus()で修正したことを覚えています。

これにより、IEとFFの両方で私の問題が解決したようです

       function mouseOverActive(e)
            {               
                //attach listener to document 
                e = e || event;
                var who = e.target || e.srcElement;
                       overlayEditor.attachListeners($_(who.id),'mouseout',mouseOutActive);
                $_(who.id).focus();
                     overlayEditor.attachListeners($_(who.id),'keydown',keypress);  
                     overlayEditor.attachListeners($_(who.id),'keyup',keyrelease);  
            }

        function mouseOutActive(e)
            {
                //attach listener to document 
                e = e || event;
                var who = e.target || e.srcElement;
                var o = $_(who.id);

                overlayEditor.removeListener(o,'mouseout',mouseOutActive);  
                overlayEditor.removeListener(o,'keydown',keypress);
                overlayEditor.removeListener(o,'keyup',keyrelease); 

                this.sbc_Aternative = false; 
                    visualTextSwitch(o,'off');

                o.blur();
            }   
于 2011-09-01T15:34:15.560 に答える
0

それを理解しました-どうやらFirefoxや他のブラウザはデフォルトでimgクリックを処理しているので、各イベントリスナーにdojo.stopEvent(evt)を含めることで、期待どおりに機能しました。

于 2011-11-23T15:34:29.040 に答える